- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
一本书提到对于std::unordered_multimap
:
The order of the elements is undefined. The only guarantee is that duplicates, which are possible because a multiset is used, are grouped together in the order of their insertion.
但从下面示例的输出中,我们可以看到打印顺序与插入顺序相反。
#include <string>
#include <unordered_map>
int main()
{
std::unordered_multimap<int, std::string> um;
um.insert( {1,"hello1.1"} );
um.insert( {1,"hello1.2"} );
um.insert( {1,"hello1.3"} );
for (auto &a: um){
cout << a.first << '\t' << a.second << endl;
}
}
编译和运行时产生这个输出(g++ 5.4.0):
1 hello1.3
1 hello1.2
1 hello1.1
更新: unordered_multiset 有同样的问题:
auto cmp = [](const pair<int,string> &p1, const pair<int,string> &p2)
{return p1.first == p2.first;};
auto hs = [](const pair<int,string> &p1){return std::hash<int>()(p1.first);};
unordered_multiset<pair<int, string>, decltype(hs), decltype(cmp)> us(0, hs, cmp);
us.insert({1,"hello1.1"});
us.insert({1,"hello1.2"});
us.insert({1,"hello1.3"});
for(auto &a:us){
cout<<a.first<<"\t"<<a.second<<endl;
}
输出:
1 hello1.3
1 hello1.2
1 hello1.1
最佳答案
这是标准对顺序的描述 [unord.req] / §6 :
... In containers that support equivalent keys, elements with equivalent keys are adjacent to each other in the iteration order of the container. Thus, although the absolute order of elements in an unordered container is not specified, its elements are grouped into equivalent-key groups such that all elements of each group have equivalent keys. Mutating operations on unordered containers shall preserve the relative order of elements within each equivalent-key group unless otherwise specified.
所以,回答这个问题:
Should items with duplicate keys in unordered_multimap be kept in the order of their insertion?
不,没有这样的要求或保证。如果本书对标准做出这样的声明,那么它是不正确的。如果本书描述了 std::unordered_multimap
的特定实现,那么该描述可能适用于该实现。
标准的要求使得使用开放寻址的实现变得不切实际。因此,兼容的实现通常使用散列冲突的单独链接,请参阅 How does C++ STL unordered_map resolve collisions?
因为等效键——必然会发生冲突——被(在实践中,没有明确要求)存储在一个单独的链表中,插入它们的最有效方法是按插入顺序 (push_back) 或反向插入 (push_front) ).如果单独的链是单链接的,则只有后者是有效的。
关于c++ - unordered_multimap 中具有重复键的项目是否应按插入顺序保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38415914/
我在练习 unordered_multimaps 时遇到了一个问题,一个 unordered_multimap 包含另一个 unordered_multimap。编译器抛出一个错误,说 c++ 标准不
我在这里要疯了。我通过谷歌搜索找到了 1 个不错的示例,其中人们将 unordered_map 与枚举类和哈希函数一起使用,但没有任何运气。我设法找到的那些最终总是说“改用 map ”。 我正在尝试执
我正在尝试使用 boost unordered_multimap 类,但在声明它时遇到了问题。错误跟在代码后面。 #include #include // header file needed f
一本书提到对于std::unordered_multimap: The order of the elements is undefined. The only guarantee is that d
所以,伙计们,我玩 std::unordered multimap 只是为了好玩。我想存储(在本例中)unsigned short,带有自定义哈希值和相等值。 有趣的部分是什么?如果两个项目都是偶数或
我尝试使用以下代码将一个值插入到 boost unordered_multimap 中,但这没有用,因为它无法编译。为什么没有访问 [] 运算符? insert()方法也不行? #include #
我有一个 std::unordered_multimap我想只对每个键进行一次迭代。 我目前正在做的是将所有 key 复制到 std::set .这对我来说似乎效率很低,我想知道是否有更聪明的方法来做
在初始化 boost::unordered_multimap 时,我们定义 HashMap 的大小。 explicit unordered_multimap(size_type n = impleme
我有一个 unordered_multimap 代表一个邻接表,还有几个有自环的边。例如: edges_ 可能是: edges_.insert(Edges::value_type(1, std::ma
我可以使用这段代码将所有元素放入一个桶中: typedef boost::unordered_multimap >
我希望 unordered_multimap::equal_range 具有平均恒定的复杂度,但是以下内容并不像预期的那样随 n 线性扩展: #include #include #include
我想创建一个映射,它使用迭代器作为键类型并使用整数作为值,如下例所示: #include #include int main(int argc, char* argv[]) { typedef
如果我有下面这段代码 std::unordered_multimap> myMap; std::vector v1, v2, v3; // init v1, v2, v3.... myMap.inse
我想构建一个 std::unordered_map,其中的值不是单个字符串、整数或 float ,而是元组、 vector 或结构。我知道这可以像@Vittorio_Romeo 和@CoryKrame
我在调试段错误时遇到问题。我很感激有关如何缩小问题范围的提示。 当迭代器试图访问结构 Infection 的元素时出现错误,定义为: struct Infection { public: expl
我有下面的代码,我知道我几乎是在重新实现容器,但我想这样做,我会有更具体的方法和我不想为不同类型的 multimap 重复代码: template class MapTemplate { public
我想访问/迭代 unordered_multimap 中的所有非唯一键。哈希表基本上是来自签名 的映射。这在实践中确实不止一次发生在标识符上 .我想在哈希表中找到那些出现一次的条目。 目前我使用这
在 boost unordered_multimap 中遍历唯一键的最简单方法是什么。 例如我有这个: std::set used; for (auto p : valuesMap) { if
当key不存在时,unordered_multimap::bucket(key)是什么应该回来吗? 引用资料说它应该返回包含键的桶的桶号,但没有说明当 unordered_multimap 中不存在该
我想知道 std::unordered_multimap 中关键对象的唯一性在处理迭代时。 我将尝试解释这一点:我需要将一些数据与 map 中的键类型相关联,这些数据不应在Hash 中考虑。或 Key
我是一名优秀的程序员,十分优秀!