C++ C++;,如何穿越无序的地图

C++ C++;,如何穿越无序的地图,c++,c++11,unordered-map,C++,C++11,Unordered Map,总结一下我的问题,在“无序映射”中,我将添加一对,用数字命名,并将其发送到函数。(函数的作用不重要。)然后我将向图形映射中添加另一个东西,但我希望能够遍历到我添加到列表中的下一个东西,因为我想在下一个函数中加入mark的名字 这里有一些代码 unordered_map<string,int> graph; unordered_map<string,int>:: iterator it; using namespace std; int main(){ strin

总结一下我的问题,在“无序映射”中,我将添加一对,用数字命名,并将其发送到函数。(函数的作用不重要。)然后我将向图形映射中添加另一个东西,但我希望能够遍历到我添加到列表中的下一个东西,因为我想在下一个函数中加入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);
    }
无序映射图;
无序映射::迭代器;
使用名称空间std;
int main(){
字符串名;
图.插入(成对(“Sue”,4));
it=graph.begin();
name=it->first;//name等于“Sue”
职能(名称);
图.插入(成对(“标记”,83));
it++//这不起作用
name=it->first;//这不会等于“Mark”
职能(名称);
}
++it
不起作用,向后走
--it
也不起作用

那么,有没有人能找到一个解决方案,让我如何反向获得
name=it->first
to be
标记


注意:(我也将多次使用此方法,因为它将进入循环。)

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

在这种情况下,您就不走运了:
std::hash
合谋让“Sue”出现在“Mark”之后,
it++
指向
graph.end()
,而
it->first
正在解除对它的引用,并出现内存错误

如果使用有序的
映射
并在“标记”后插入“Sue”(或者使用
std::greater
作为
映射
比较“标记”在“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;
}
#包括
#包括
#包括
使用名称空间std;
地图图;
对它进行迭代器;
int main()
{
字符串名;
插入图形(成对(“标记”,4));
it=graph.begin();
name=it->first;//name等于“Sue”
std::cout first;//这不会最终等于“Mark”

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

在某些其他语言(C#)中,如果
IEnumerable
(例如
列表
)在
IEnumerator
(又称迭代器)处于活动状态时发生更改,则
枚举器
无效 下面的
IEnumerator::MoveNext()
将抛出一个
InvalidOperationException

还指出:

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


“下一件事”是什么意思?下一件事的顺序是什么?@TemplateRex我唯一做过的事就是编辑文本。我从未(从未)删除或考虑删除标记。(如果这样的事情发生是不情愿的,或者你弄错了)@simplicisveritatis好吧,编辑历史记录显示你删除了它,但如果是偶然的,没有问题!