【问题标题】:Make Map Key Sorted According To Insert Sequence使映射键按插入顺序排序
【发布时间】:2010-04-19 01:54:58
【问题描述】:

如果没有其他容器(如矢量)的帮助,我是否可以使地图的键排序与插入序列相同?

#include <map>
#include <iostream>

using namespace std;

int main()
{
  map<const char*, int> m;
  m["c"] = 2;
  m["b"] = 2;
  m["a"] = 2;
  m["d"] = 2;


  for (map<const char*, int>::iterator begin = m.begin(); begin != m.end(); begin++) {
      // How can I get the loop sequence same as my insert sequence.
      // c, b, a, d
      std::cout << begin->first << std::endl;
  }

  getchar();
}

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    没有。 std::map 是一个已排序的容器;不维护插入顺序。有许多解决方案使用第二个容器来维护插入顺序in response to another, related question。

    也就是说,您应该使用std::string 作为您的密钥。使用const char* 作为映射键是一个坏主意:它几乎不可能通过键访问或搜索元素,因为只会比较指针,而不是字符串本身。

    【讨论】:

    • 谢谢。似乎是一个重复的问题。
    【解决方案2】:

    没有。 std::map&lt;Key, Data, Compare, Alloc&gt;按照第三个模板参数Compare排序,默认为std::less&lt;Key&gt;。如果你想要插入序列,你可以使用std::list&lt;std::pair&lt;Key, Data&gt; &gt;。

    编辑:

    正如所指出的,任何顺序 STL 容器都可以:vector、deque、list,或者在这种特殊情况下是事件 string。您必须根据各自的优点做出决定。

    【讨论】:

    • Iiiirrk。还有一个开发者推荐list。如果尼尔听说了这件事,他会打你的头。提示:您最好推荐vector 或deque,这里绝对没有要求建议使用list 永远有用。
    • 也不需要使用vector。在某些时候,人们必须学会自己做决定,而不仅仅是听 Neil 的意见。
    【解决方案3】:

    考虑使用 boost::multi_index 容器而不是 std::map。您可以在容器上同时放置有序映射索引和无序顺序索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2011-06-22
      • 2019-04-29
      • 1970-01-01
      相关资源
      最近更新 更多