由于std::map
和类似的数据结构,基于密钥可以轻松快速插入,访问和删除数据元素。
感谢std::make_heap
及其收集,可以根据值维护优先级队列。
但很多时候,算法需要两者的结合。例如,一个具有以下结构:
struct entry{
int id;
char name[20];
double value;
}
该算法需要快速查找并删除entry
最高的value
。这需要具有std's
堆函数的优先级队列。它还需要根据name
和/或id
快速删除一些元素。这需要std::map
。
当编程这种算法时,我经常最终只使用一个好的数据结构来进行最需要的操作(例如,优先访问),然后使用线性搜索通过该结构进行较少需要的操作,示例删除密钥。
但是有可能实现这种算法,保持对两个密钥的优先级和访问权限的快速访问吗?
答案 0 :(得分:1)
一种方法是提升多指数。
另一种方法是创建两个数据结构,其值为shared_ptr<const entry>
并使用不同的排序,然后是一个包装类,确保在两者中都进行添加/删除。当你想要编辑时,你自然要删除然后重新插入。
Boost的多索引设置起来比较复杂,但由于两个数据结构交织在一起,声称性能更快,从而带来更好的缓存性能和更少的内存使用。