STL容器结合了顺序排序和持续访问时间?

时间:2015-02-28 17:45:05

标签: c++ stl

这让我觉得我应该能够在Stackoverflow上找到它,但也许我在这里搜索错误的术语。

我有一个类

的场景
class Foo
{
  int key;
  int b;
  ...
}

我希望将该类的新元素推送到列表中。物品数量事先未知。

同时,我希望能够快速检查具有某个键的元素的存在(并检索),例如键== 5。

所以,总结一下:

  • 它应该有O(1)(或左右)存在/检索/删除
  • 应该保留推送项目的顺序

对此的一个解决方案让我感到“使用std :: list来存储项目,并使用std :: unordered_map来检索它们,并使用一些簿记”。我当然可以自己实现它,但是想知道这样的东西是否已经在STL中以方便的形式存在。

编辑:要抢占该建议,std :: map 不是解决方案,因为它基于某些键进行排序。也就是说,它不会保留我推送项目的顺序。

1 个答案:

答案 0 :(得分:2)

STL没有那种容器,您可以使用std :: unordered_map和std :: list编写自己的容器。将键映射到std :: unordered_map中的列表迭代器,并将键值对存储在std :: list中。

void add(const Key& key, const Value& value) 
{
    auto iterator = list.insert(list.end(), std::pair<Key, Value>(key, value));
    map[key] = iterator;
}

void remove(const Key& key)
{
    auto iterator = map[key];
    map.erase(key);
    list.erase(iterator);
}

或者使用boost多索引容器 http://www.boost.org/doc/libs/1_57_0/libs/multi_index/doc/tutorial/index.html