使用insert C ++后维护无序集合中的顺序

时间:2016-12-31 04:05:16

标签: c++ insert c++14 unordered-set

如何在构造期间使用insert(或emplace)而不分配时保留无序集合中元素的顺序?

有关此问题的详细信息,请参阅以下示例:

  • 构造无序的整数集合
  • 480插入S:S = {480}
  • 32插入S:S = {32 480}
  • 23插入S:S = {23 32 480}
  • 16插入S:S = {16 23 32 480}
  • 19插入S:S = {19 480 32 23 16}

你可以看到最后一次插入如何破坏序列顺序(我假设通过重建一个更大的集合并移动元素)。我正在寻找一种方法来在插入元素之后保留先前的顺序,而无需在构造函数中专门分配。

2 个答案:

答案 0 :(得分:9)

根据定义,无序集是无序的。没有定义的顺序,集合中元素的迭代顺序可以随时改变。

在构造函数中分配一些东西也不会产生任何影响。

如果您想要一个具有特定迭代顺序的集合,那就是std::set的用途。但是,std::set始终按键值排序,而不是按顺序排序。

您可能需要将多个容器组合在一起,以实现所需的访问语义。

答案 1 :(得分:0)

无序集通常基于散列函数分配,并且具有O(1)访问时间。

有序集通常基于AVL树,访问基于密钥之间的比较功能。它们通常具有O(log(n))访问时间,但是具有保存密钥顺序。

如果您希望快速访问或几乎可以快速访问地图中的排序键,则需要三思而后行。但是没有两种可能性(如量子物理学中的不确定问题:))