我正在使用STL std :: multiset <>作为指针的排序列表.排序顺序由指向的项的属性确定,这与此简化示例的行相似:
struct A
{
int x;
};
bool CompareAPointers(const A* lhs, const A* rhs)
{ return lhs->x < rhs->x; }
std::multiset<A*, CompareAPointers> sorted_set;
Run Code Online (Sandbox Code Playgroud)
复杂的是,用于对集合进行排序的属性值可以更改(您可以在上面的示例中更改Ax),这可能会使排序顺序不正确:
A a1, a2;
a1.x = 1;
a2.x = 2;
sorted_set.insert(&a1);
sorted_set.insert(&a2);
a1.x = 3;
Run Code Online (Sandbox Code Playgroud)
当相关属性发生变化时,我可以通过擦除和重新插入元素来保持列表排序,但是簿记会变得有点痛苦.我觉得我这一切都错了.任何人都可以建议一种更好的方法来保持列表排序时排序顺序可以动态更改?这些变化在可预测的时间以可预测的方式发生,但我目前的方法感觉不对.
Boost Multi-Index支持对您想要的任何内容进行排序,并支持更改列表所用的字段,尽管您不能再单独键入a1.x=1,而是必须使用MultiIndex :: replace().
我无法想到更快/更自然的方式,因为删除和重新插入元素无论如何都要完成.