我有一些数据,其中包含与每个数据项相关联的键。密钥由两部分组成:让我们称它们为颜色和id。我希望按颜色迭代容器以加快渲染速度,我还希望仅通过id在容器中查找项目。
我尝试使用std :: map来使用密钥
class MyKey {
public:
int color;
int id;
bool operator<(...)
bool operator==(...)
};
但我无法提供&lt;运算符将保持数据按颜色排序,同时允许map :: find仅在id上工作(即没有关于颜色的信息)。
我希望insert和find操作都很快(例如O(log(n)))。
任何想法我可以用什么样的容器来实现这个?
答案 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
一个数据结构并将指针插入两个映射。查找操作将使用任一映射来定位项目。对于删除/删除操作,它有点棘手:您需要通过映射查找数据结构,然后从两个映射中删除它,可能通过使用数据结构中的数据来查找其他映射条目。