C++ 使用多个键或键和优先级快速访问的数据结构

C++ 使用多个键或键和优先级快速访问的数据结构,c++,algorithm,dictionary,priority-queue,C++,Algorithm,Dictionary,Priority Queue,得益于std::map和类似的数据结构,基于键可以轻松地快速插入、访问和删除数据元素 多亏了std::make_heap及其集合,基于值维护优先级队列变得很容易 但很多时候,算法需要两者的结合。例如,其中一个具有以下结构: struct entry{ int id; char name[20]; double value; } 算法需要快速查找并删除具有最高值的条目。它使用std的堆函数调用优先级队列。它还需要根据name和/或id快速删除一些元素。这需要一个std::

得益于
std::map
和类似的数据结构,基于键可以轻松地快速插入、访问和删除数据元素

多亏了
std::make_heap
及其集合,基于值维护优先级队列变得很容易

但很多时候,算法需要两者的结合。例如,其中一个具有以下结构:

struct entry{
    int id;
    char name[20];
    double value;
}
算法需要快速查找并删除具有最高
值的
条目
。它使用
std的
堆函数调用优先级队列。它还需要根据
name
和/或
id
快速删除一些元素。这需要一个
std::map

在编写这类算法时,我通常只使用一个好的数据结构来完成最需要的操作(例如,优先级访问),然后使用线性搜索通过该结构来完成不太需要的操作,例如删除密钥


但是有没有可能实现那种保持快速访问优先级和访问两个键的算法呢?

一种方法是boost多索引

另一种方法是创建两个数据结构,其值为
shared_ptr
,并使用不同的顺序,然后创建一个包装类,确保在这两个数据结构中进行添加/删除。当您想要编辑时,自然必须先删除,然后重新插入


Boost的多索引设置更为复杂,但由于两个数据结构相互交织,因此性能更快,从而导致更好的缓存性能和更少的内存使用。

是否可以选择使用两个数据结构?使用每种类型中的一种,并参考实际数据。