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

How does c++ stl unordered_map print all its values?

我正在使用 c++ stl unordered_map 库来解决一些 leetcode 问题。我可以使用 find 函数和 [] 运算符重载来访问我的元素。但我已经看到一些答案使用 for 循环遍历 hashmap 的所有元素。根据我的理解,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 数据结构的基础向量的每个元素都具有垃圾值,因为并非所有成员都填充在向量中,但结果不包括这些值,只给出正确的输出.没看懂。

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

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

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

  2. 一个更常见的实现是 linked 列表的数组。在这里,迭代器包含数组中的位置和列表的 link。递增时,它会尝试移动到下一个 link。如果 none 存在,它会移动到下一个 nonempty 列表。