Убедитесь, что мультимножество переупорядочено при изменении объектов - PullRequest
0 голосов
/ 03 сентября 2010

У меня есть мультимножество с пользовательской функцией предиката, например, multiset<MyClass *,MyCompFunc>, где MyCompFunc просматривает атрибут объектов MyClass.В ходе выполнения приложения объекты могут измениться таким образом, что это должно привести к их переупорядочению.

Каков правильный способ переупорядочить мультимножество, когда это происходит?Сортировать вручную или удалить измененный объект, обновить его и заново вставить?

Ответы [ 4 ]

3 голосов
/ 03 сентября 2010

Обычно это удаление, обновление и повторная вставка. Практически все остальное, по крайней мере, временно нарушает основной инвариант набора / мультимножества, что явно нехорошо.

1 голос
/ 04 сентября 2010

Я до сих пор не могу найти ничего, что говорит это явно, но если вы измените ключ [*], то, например, ваш компаратор не удовлетворяет требованиям 25.3 (строгий слабый порядок):

comp вызывает четко определенное отношение для классов эквивалентности, определяемых по эквиваленту

comp, не является четко определенным отношением, если возвращает разные значения для одних и тех же входных данных в разное время.

В вашем случае я считаю, что можно изменить поля MyClass, которые не участвуют в сравнении.

Интересно, что 23.1.2 / 2 гласит: «Каждый ассоциативный контейнерпараметризованный на ключе и отношение упорядочения Compare, которое вызывает строгую слабую упорядоченность (25.3) для элементов ключа ".Я думаю, мы можем принять это, чтобы означать, что компаратор вызывает строгое слабое упорядочение для Key объектов , которые являются элементами контейнера , не обязательно для всех объектов типа Key.Например, если Key является указателем, я уверен, что можно написать компаратор, который разыменовывает его, при условии, что вы не используете нулевой указатель в качестве ключа.По той же причине, я надеюсь, что мы можем изменить ключ, которого нет в контейнере.

[*] с помощью «изменить», я имею в виду сделать что-нибудь, что изменяет результаты компаратора с этим ключом и некоторымидругой ключ.В этом случае, конечно, вы на самом деле не модифицируете сам ключ (который является просто значением указателя), но я так его называю.

0 голосов
/ 03 сентября 2010

Если вы будете изменять часть ключа сравнения объекта, сначала удалите элемент из набора, затем выполните модификацию, а затем добавьте его обратно в набор.Таким образом, вы не будете нарушать инвариант набора, поскольку наборы просто не предназначены для изменения порядка при смене ключа.

0 голосов
/ 03 сентября 2010

Не получить доступ к объектам по ссылке.Скопируйте их и вставьте заново, если их ключ изменился.Вы можете использовать наблюдателя для автоматизации этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...