控制地图中元素的顺序

时间:2012-12-09 17:31:37

标签: c++ map iterator

我创建了一张地图:

map<string, string> cuts;

cuts["cutb"] = "a>1";
cuts["cuta"] = "b>3";
cuts["cutc"] = "c<5";

当我使用map<string, string>::iterator itr = cuts.begin();迭代此地图时,它会按字母顺序排序:cuta,cutb,cutc等。

如何强制迭代器遵循我定义元素的顺序,即cutb,cuta,cutc?

3 个答案:

答案 0 :(得分:3)

您需要使用数据结构的其他一些实现。在您的情况下,红黑树实现不适合您。

从更一般的角度来看:如果按顺序遍历条目,为什么需要创建地图?不会列出/数组/向量对吗?

编辑:提示:每当您选择使用特定数据结构时,请询问您自己需要支持哪些操作。在回答之后,您应该能够更精确地选择。如果您需要按键查找,按键插入并检查是否存在某个键,则映射是好的。但是,您将在优化这些操作的实现中支付的价格通常是您丢失了元素的插入顺序。

EDIT2 :循环遍历对列表:

// pair is class in namespace std
vector<pair<string, string> > v;
v.push_back(make_pair("cutb", "a>1"));
v.push_back(make_pair("cuta", "b>3"));
v.push_back(make_pair("cutc", "c<5"));
for (int i = 0; i < v.size(); i++) {
  // the first element of the pair is addressed with .first; the second - .second
  cout << "For key " << v[i].first << " the value is "  << v[i].second << endl;
}

在vector中迭代也可以使用迭代器完成,但我更喜欢索引方法,因为它同样最优,但更容易理解。

答案 1 :(得分:2)

你不能(或者你可以,你不应该)。如果您需要保留订单,则需要其他数据结构。试试STL的vector

http://www.cplusplus.com/reference/vector/vector/

答案 2 :(得分:2)

好的,这会更具可读性:

typedef std::pair<std::string, std::string> item;
std::vector<item> vec; 
vec.push_back(item("hello", "world"));
vec.push_back(item("abc", "efg"));

for (size_t i = 0; i < vec.size(); ++i) {
    std::cout << vec.at(i).first << " " << vec.at(i).second << std::endl;
}