【问题标题】:C++ dictionary/map with added order添加顺序的 C++ 字典/地图
【发布时间】:2010-03-31 09:57:13
【问题描述】:

我想要类似于 map 的东西,但在迭代时我希望它们与添加时的顺序相同。

例子

map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);

在迭代时,我希望项目类似于“一”、“二”、“三”。默认情况下,地图不提供此添加顺序。如何以我添加的方式获取地图元素?我想保留广告订单。

使用 STL 的任何东西都可以,或者其他替代建议也可以。

【问题讨论】:

  • 您是在询问保留插入顺序还是按照英语单词的意思对键进行排序?
  • 在我的一个 cmets 中,他还说他需要索引访问权限,所以很多帖子都是错误的,因为问题不够明确
  • 在这种情况下,这是多次重复的骗局 - 例如,请参阅 stackoverflow.com/questions/1098175/…

标签: c++ stl map


【解决方案1】:

A std::map that keep track of the order of insertion? 这是重复的(感谢 neil butterworth)

您可以使用具有与其平行的排序结构的地图。

map<key, value>
vector<value*> //holds only pointers to map entries.
vector<key> //holds only map keys. Adds one indirection.

【讨论】:

  • 但我想通过索引访问,例如 map["one"] 以返回 1。否则向量需要迭代来选择并返回元素
  • 你不能有引用向量,因为向量元素必须是可赋值的。
  • 你可以有一个以迭代器为第二个元素的无序映射
【解决方案2】:

Boost mult iindex 使得拥有一个可以按多个不同顺序迭代的容器成为可能。

http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/index.html

稍作修改的例子:

struct record {
    int         insertion_index;
    std::string somestring;
    int         somevalue;
    bool operator < (const record& e) const {return insertion_index < e.insertion_index;}
};

typedef multi_index_container<
    record,
    indexed_by<
        // sort by record::operator<
        ordered_unique<insertion_indexentity<record> >,        
        // sort by less<string> on somestring
        ordered_non_unique<member<record,std::string,&record::somestring> >    
    >
> record_set;

【讨论】:

    【解决方案3】:

    实际上std::map 默认使用std::less&lt;T&gt; 对您的密钥进行排序,其中T 是您密钥的类型。如果您不希望元素按键排序,则应使用std::list&lt;std::pair&lt;K,V&gt; &gt;std::vector&lt;std::pair&lt;K,V&gt; &gt; -- 其中K 是您的键类型,V 是您的值类型,然后使用@987654328 @ 将元素添加到列表/向量的末尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      相关资源
      最近更新 更多