如果没有其他容器(如矢量)的帮助,我是否可以使地图的键与插入序列的顺序相同?
#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();
}
答案 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容器都会执行:vector
,deque
,list
,或者在此特定情况下事件string
。你必须决定每个人的优点。
答案 2 :(得分:0)
考虑使用boost :: multi_index容器而不是std :: map。您可以在容器上放置有序的映射索引和无序的顺序索引。