Я использую 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;
сложность заключается в том, что значения имущества, используемого для сортировки набора можно изменить (вы можете изменить Ax в приведенном выше примере), который может сделать порядок сортировки некорректный:
A a1, a2;
a1.x = 1;
a2.x = 2;
sorted_set.insert(&a1);
sorted_set.insert(&a2);
a1.x = 3;
Я могу держать список, отсортированный по стиранию и вставив элементы, когда соответствующие изменения атрибутов, но бухгалтерский учет становится в быть немного болью. Я чувствую, что все это неправильно. Может ли кто-нибудь предложить лучший способ сохранить список, отсортированный, когда порядок сортировки может динамически измениться? Изменения происходят предсказуемыми способами в предсказуемые моменты времени, но мой текущий подход только чувствует неправильно.
modify() может быть немного лучше, так как элементы в любом случае не являются уникальными. Основной недостаток заключается в том, что вам нужно написать назначение в функтор ... –
MultiIndex :: replace() - это предположение, которое, я считаю, лучше всего соответствует ситуации. Он имеет правильный баланс между контролем, потенциалом эффективности и заботой о деталях для меня. Я не верю, что изменение() необходимо, поскольку я храню указатели, а не фактические объекты, что делает элемент копированием тривиальным. Спасибо за предложения! – Darryl