c++ stl unordered_map 如何打印其所有值?

Posted

技术标签:

【中文标题】c++ stl unordered_map 如何打印其所有值?【英文标题】:How does c++ stl unordered_map print all its values? 【发布时间】:2019-09-06 06:47:32 【问题描述】:

我正在使用 c++ stl unordered_map 库来解决一些 leetcode 问题。我可以使用 find 函数和 [] 运算符重载来访问我的元素。但是我已经看到了一些使用 for 循环遍历哈希图的所有元素的答案。据我了解,hashmap 的内部结构通常是一个向量,并且这个向量永远不会被完全使用(这意味着会有空槽来保持恒定的大 O,以免发生太多冲突)。但是从答案中我看到人们正在迭代向量,但他们没有打印这些空索引,因为我没有看到任何垃圾值。我不明白这怎么可能。这是我见过的代码。

vector<vector<string>> groupAnagrams(vector<string>& strs) 
        unordered_map<string, vector<string>> mp;
        for (string s : strs) 
            mp[t].push_back(s);
        
        vector<vector<string>> anagrams;
        for (auto p : mp)   //this is the part I don't understand
            anagrams.push_back(p.second);
        
        return anagrams;
     

我希望遍历 hashmap 数据结构的底层向量的每个元素都有垃圾值,因为并非所有成员都填充在向量中,但结果不包括这些值,只给出正确的输出。我不明白怎么做。

【问题讨论】:

在不相关的注释中,您不需要第一个循环。只需执行mp[t] = strs; 即可一次性复制完整向量。 哇,我不知道这是可能的。谢谢。 【参考方案1】:

从您的问题来看,您似乎可能认为 STL 容器的迭代器直接迭代底层数据结构。事实并非如此。迭代器本身可以包含字段和逻辑,以允许它以逻辑方式进行迭代。

标准库没有规定算法实现,但所有常见的都可以支持迭代而无需遍历空元素:

    您所写的封闭表实现(STL 的实现在实践中并未使用它)有一个条目数组,每个条目都被采用或不采用。每个条目都可以通过具有一对数组(一个用于值,一个用于布尔值)或使用两个数组来标记为已采用。在任何情况下,当迭代时,迭代器在递增时只是绕过所有未采用的条目。

    更常见的实现是链表数组。在这里,迭代器既包含数组中的位置,也包含列表的链接。当增加时,它会尝试移动到下一个链接。如果不存在,则移动到下一个非空列表。

【讨论】:

非常感谢,请问在这种情况下 auto 等于什么? 那是不相关的一点。在这种情况下,auto 允许您定义一个变量以用于迭代迭代器的所有值。见here。 @OgiciBumKacar 是的,使用(int i=0;i&lt;hashmap.size();i++) 不是遍历无序映射的方法,因为它不允许您访问第 i 个元素。 @OgiciBumKacar auto 是一个placeholder type specifier,用于编译器的自动类型推断。在您的特定情况下,编译器会将其推断为unordered_map&lt;string, vector&lt;string&gt;&gt;::value_type @Someprogrammerdude 很好的解释!

以上是关于c++ stl unordered_map 如何打印其所有值?的主要内容,如果未能解决你的问题,请参考以下文章

C++ stl unordered_map 单写(只插入,不删除)和单读并发访问

C++ STL 相关 部分笔记

C++源码剖析——unordered_map和unordered_set

二进制搜索 C++ STL

Leetcode-1 两数之和(STL, hashTable, unordered_map)

Leetcode-1 两数之和(STL, hashTable, unordered_map)