如何在构造期间使用insert(或emplace)而不分配时保留无序集合中元素的顺序?
有关此问题的详细信息,请参阅以下示例:
你可以看到最后一次插入如何破坏序列顺序(我假设通过重建一个更大的集合并移动元素)。我正在寻找一种方法来在插入元素之后保留先前的顺序,而无需在构造函数中专门分配。
答案 0 :(得分:9)
根据定义,无序集是无序的。没有定义的顺序,集合中元素的迭代顺序可以随时改变。
在构造函数中分配一些东西也不会产生任何影响。
如果您想要一个具有特定迭代顺序的集合,那就是std::set
的用途。但是,std::set
始终按键值排序,而不是按顺序排序。
您可能需要将多个容器组合在一起,以实现所需的访问语义。
答案 1 :(得分:0)
无序集通常基于散列函数分配,并且具有O(1)访问时间。
有序集通常基于AVL树,访问基于密钥之间的比较功能。它们通常具有O(log(n))访问时间,但是具有保存密钥顺序。
如果您希望快速访问或几乎可以快速访问地图中的排序键,则需要三思而后行。但是没有两种可能性(如量子物理学中的不确定问题:))