C++,如何遍历一个未定义的映射
C++, How to traverse through a unordered_map
为了总结我的问题,在"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 -> first
为Mark
?
注意:(我也会多次使用这个方法,因为它会进入一个循环。(
对于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((时,才会发生重新哈希。
- 在VSCode中编译C++给了我一个未定义的参考
- 我对C++程序有一个未定义的参考,不知道如何处理它
- 为什么这是一个未定义的行为?
- 在链接链接静态(GSOAP)库的共享库时,为什么会得到一个未定义的符号
- yaml-cpp:创建一个未定义的节点
- mac构建有一个未定义的符号,而linux构建并没有用于相同的代码
- 为什么我有一个未定义的对友元函数的引用
- 对于自定义类的一个未定义集,是否有一个默认的散列函数
- 在定义之前声明一个未定义的 std::function 的目的是什么?
- 在 c++ 中对 class::function 的另一个未定义的引用
- 有没有办法放入一个未定义大小的数组并作为静态数组继承
- Android NDK:创建一个未定义函数的库
- 为什么我在这个C++代码中得到了一个未定义的引用
- LoopFillZerobss对main有一个未定义的引用
- 为一个未定义的映射打开MP/_gno_parallel
- 休斯顿,我们有一个未定义的参考
- 另一个未定义的引用错误
- g++说我对一个函数有一个未定义的引用
- ostringstream是一个未定义的类型
- 对boost::system::generic的另一个未定义引用