根据插入序列对地图键进行排序

时间:2010-04-19 01:54:59

标签: c++ stl

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

#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();
}

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

没有。 std::map<Key, Data, Compare, Alloc>根据第三个模板参数Compare排序,默认为std::less<Key>。如果您想要插入序列,可以使用std::list<std::pair<Key, Data> >

编辑:

正如所指出的,任何顺序STL容器都会执行:vectordequelist,或者在此特定情况下事件string。你必须决定每个人的优点。

答案 2 :(得分:0)

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