【问题标题】:Control the order of elements in map控制地图中元素的顺序
【发布时间】:2012-12-09 17:31:37
【问题描述】:

我创建了一张地图:

map<string, string> cuts;

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

当我使用 map&lt;string, string&gt;::iterator itr = cuts.begin(); 遍历此地图时,它会按字母顺序排列:cuta、cutb、cutc 等。

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

【问题讨论】:

    标签: c++ map iterator


    【解决方案1】:

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

    从更一般的角度来看:如果按添加顺序遍历条目,为什么需要创建映射?对列表/数组/向量对您来说不够吗?

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

    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;
    }
    

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

    【讨论】:

    • 但是我如何遍历一个配对列表呢?
    • @mareks:在我贴的代码sn-p中添加了向量的填充
    • 向量 > v;应该是vector > v;
    【解决方案2】:

    你不能(或者如果你可以,你不应该)。如果需要保留顺序,则需要另一种数据结构。试试 STL 的vector

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

    【讨论】:

    • 我不会参考 SGI 的文档,因为所谓的 STL 与原始 SGI 的实现略有不同。
    • 如何将 2 个字符串存储为向量的一个元素?
    • std::vector&lt;std::pair&lt;std::string, std::string&gt; &gt;
    • @MatteoItalia 这也无关紧要,因为大概 OP 正在使用 C++ 标准库。
    • @MatteoItalia 更改了它,尽管在这种情况下它并不是非常重要
    【解决方案3】:

    好的,这将更具可读性:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多