我很难把头包裹在unordered_maps和unordered_multimaps周围,因为我的测试代码并没有产生我所预期的结果。
std::unordered_map<string, int> names;
names.insert(std::make_pair("Peter", 4));
names.insert(std::make_pair("George", 4));
names.insert(std::make_pair("George", 4));
当我遍历这个列表时,我首先得到乔治的一个实例,然后是彼得。
1)我的理解是unordered_maps不允许多个键映射到一个值,并且那个multimaps到期了。这是真的吗?
2)彼得和乔治为什么能以4的价值共存?第二个乔治发生了什么事?就此而言,如果这是无序的,那么当我从begin()迭代到end()时,为什么George首先出现?
3)无序地图与无序多地图的基本表示是什么?
4)有没有办法在没有提供值的情况下将键插入任何一个地图?例如。让编译器创建自己的哈希函数,当我检索密钥并查找冲突时,我不需要担心?
答案 0 :(得分:2)
我做得很简短:
Peter != George
,这就是为什么他们有不同的密钥,并且很可能具有相同的价值。在您的示例中,使用(非多)George
的第二次插入被跳过,因为之前插入了相同的密钥。
答案 1 :(得分:1)
你想使用unordered_multimap来拥有几个相同的键。
由于这是无序的,你真的不希望有任何特定的顺序,因为它取决于散列函数。
如果您想要插入内容的顺序,则需要使用std :: vector。即使是应该被排序的法线贴图也意味着比较顺序,而不是插入事物的顺序,例如字符串“AB”出现在“BB”之前,因为“A”小于“B”。
要在不提供值的情况下插入,您需要一个集合,而不是地图。
“无序”事物的基础结构是哈希表。