哪个已分类的STL容器用于快速插入并使用特殊键查找?

时间:2010-09-17 09:43:58

标签: c++ stl key containers

我有一些数据,其中包含与每个数据项相关联的键。密钥由两部分组成:让我们称它们为颜色和id。我希望按颜色迭代容器以加快渲染速度,我还希望仅通过id在容器中查找项目。

我尝试使用std :: map来使用密钥

class MyKey {
public:
  int color;
  int id;
  bool operator<(...)
  bool operator==(...)
};

但我无法提供&lt;运算符将保持数据按颜色排序,同时允许map :: find仅在id上工作(即没有关于颜色的信息)。

我希望insert和find操作都很快(例如O(log(n)))。

任何想法我可以用什么样的容器来实现这个?

3 个答案:

答案 0 :(得分:3)

根据以下修改调整Boost.Multi_index中的示例here

typedef multi_index_container<
    MyKey,
    indexed_by<ordered_unique<identity<MyKey> >,
    ordered_non_unique<member<MyKey,int,&MyKey::color> >
  > 
> DataSet;

答案 1 :(得分:1)

尝试Boost.BiMap,这是一张有2个视图的地图。

否则会有更复杂的Boost.MultiIndex。

答案 2 :(得分:0)

如果你宁愿自己编写而不是使用Boost(在我看来是愚蠢的)你可以创建一个包含两个地图的类。一个用于映射颜色,另一个用于映射ID。地图值将是指针。您将为新类定义插入和查找操作。插入将new一个数据结构并将指针插入两个映射。查找操作将使用任一映射来定位项目。对于删除/删除操作,它有点棘手:您需要通过映射查找数据结构,然后从两个映射中删除它,可能通过使用数据结构中的数据来查找其他映射条目。