C++,如何遍历一个未定义的映射

C++, How to traverse through a unordered_map

本文关键字:一个 未定义 映射 遍历 何遍历 C++      更新时间:2023-10-16

为了总结我的问题,在"unordered_map"中,我将添加一对,用数字命名,并将其发送给一个函数。(函数做什么并不重要。(因此,我将向图映射中添加另一个东西,但我希望能够遍历到我添加到列表中的下一个东西。因为我想在下一个函数中插入mark的名称。

这是一些代码

unordered_map<string,int> graph;
unordered_map<string,int>:: iterator it;
using namespace std;
int main(){
    string name;
    graph.insert(pair<string,int>("Sue",4));    
    it=graph.begin();
    name = it -> first; //name is equal to "Sue"
    function(name);
    graph.insert(pair<string,int>("Mark",83));
    it++ // this will not work
    name = it -> first; //this will not end up equaling to "Mark"
    function(name);
    }

执行++it不起作用,向后执行--it也不起作用。

那么,有人有一个解决方案吗?我如何向后获得name = it -> firstMark

注意:(我也会多次使用这个方法,因为它会进入一个循环。(

对于unordered_map,不能保证在另一个项目之后插入的项目也会存储在该项目之后。这就是无序映射的含义。

在这种情况下,你运气不好:std::hash<std::string>密谋让"Sue"出现在"Mark"之后,it++指向graph.end()it->first正在取消引用,这是一个内存错误。

如果使用排序的map<string, int>并在"Mark"之后插入"Sue"(或者使用std::greater作为map比较,以比较"Mark"在"Sue"之后的原始顺序(,那么元素的顺序就是您所期望的。

#include <unordered_map>
#include <map>
#include <iostream>
using namespace std;
map<string,int> graph;
map<string,int>:: iterator it;
int main()
{
    string name;
    graph.insert(pair<string,int>("Mark",4));    
    it=graph.begin();
    name = it -> first; //name is equal to "Sue"
    std::cout << name;
    graph.insert(pair<string,int>("Sue",83));
    it++ ;// this will not work
    name = it -> first; //this will not end up equaling to "Mark"
    std::cout << name;
}

实例

我认为这是因为迭代器值是在调用Begin()时生成的。

在一些其他语言(C#(中,如果IEnumerable(例如List(在IEnumerator(又名迭代器(活动时发生更改,则Enumerator将变为无效并且随后的CCD_ 18将抛出一个CCD_
请参阅MSDN关于IEnumerator的文章。MoveNext方法((

此外,这篇关于CPR参考的文章指出:

如果由于插入而发生重新哈希,则所有迭代器都将无效。否则迭代器不会受到影响。引用不会失效。只有当元素的新数量等于或大于max_load_factor((*bucket_count((时,才会发生重新哈希。