【问题标题】:How to find the value for a key in unordered map?如何在 unordered_map 中找到键的值?
【发布时间】:2021-02-04 04:22:44
【问题描述】:

我正在尝试在 C++ 中的无序映射中执行以下示例

my_dict = {'one': ['alpha','gamma'], 'two': ['beta'], 'three' : ['charlie']}
print(my_dict["one"]) // ['alpha','gamma']

我尝试使用find 运算符,如下所示

int main ()
{
std::unordered_map<std::string, std::vector<std::string>> dict;
dict["one"].push_back("alpha");
dict["one"].push_back("beta");
dict["two"].push_back("gamma");
 auto it = dict.find("one");
 cout<<it->second<<endl; // expected output alphabeta
return 0;
}

但我无法检索此键 dict["one"] 的值。我错过了什么吗? 非常感谢任何帮助。 谢谢

【问题讨论】:

  • it-&gt;second 是一个std::vector 对象,而std::vector 对象不能直接打印到std::cout(它没有operator&lt;&lt; 用于std::ostreams)。如果要打印矢量,则需要实际单独打印元素
  • @Human-Compiler 感谢您的回复。如何单独打印?你的意思是这样for (auto i: it) std::cout &lt;&lt; i &lt;&lt; ' ';
  • @learner 如果你使用 rb-for,它应该是 for (auto i: it-&gt;second) std::cout &lt;&lt; i &lt;&lt; ' ';。这确实是打印矢量的正确方法。

标签: c++ unordered-map


【解决方案1】:

您遇到的失败是由于it-&gt;second 是一个std::vector 对象,它无法打印到std::cout,因为它缺少operator&lt;&lt;(std::ostream&amp;,...) 的重载。

与 Python 等为您执行此操作的语言不同,在 C++ 中,您必须手动循环遍历元素并打印每个条目。

要解决此问题,您需要更改此行:

 cout<<it->second<<endl; // expected output alphabeta

改为打印容器中的每个对象。这可能很简单,比如遍历所有元素并打印它们:

for (const auto& v : it->second) {
    std::cout << v << ' '; // Note: this will leave an extra space at the end
}
std::cout << std::endl;

或者,如果确切的格式很重要,您可以变得更复杂。


@DanielLangr 在 cmets 中发布了一个链接,该链接总结了所有可能的方法,如果您想要更复杂的东西,我建议您查看一下:How do I print the contents to a Vector?

【讨论】:

    【解决方案2】:

    这是因为您的it-&gt;first 将指向字典的键,即“一”,而it-&gt;second 将指向值,即向量。

    因此,要打印向量的元素,您还需要指定要打印的向量的索引。下面的代码会给你你想要的结果:

    int main() {
    std::unordered_map <std::string, std::vector<std::string>> dict;
    dict["one"].push_back("alpha");
    dict["one"].push_back("beta");
    dict["two"].push_back("gamma");
    auto it = dict.find("one");
    cout<<it->second[0]<<it->second[1]<<endl; // expected output alphabeta
    return 0;
    

    }

    附:如果您觉得它有用,请接受我的回答,因为这将帮助我获得一些声誉积分

    【讨论】:

    • 感谢您的回复。我接受@Human-Compiler 答案是因为答案更有效,因为使用 for 循环来获取向量中的所有元素。我可以投票赞成你的答案,但 StackOverflow 不允许我因为我的声誉..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    相关资源
    最近更新 更多