Я до сих пор не могу найти ничего, что говорит это явно, но если вы измените ключ [*], то, например, ваш компаратор не удовлетворяет требованиям 25.3 (строгого слабого порядка):
компа индуцирует вполне определенное соотношение на классах эквивалентности определяется с помощью эквива
comp
не вполне определенной связи, если она возвращает различные значения для одних и тех же входов в разное время.
В вашем случае я считаю, что это нормально, чтобы изменить поля MyClass
, которые не участвуют в сравнении.
Интересно, что 23.1.2/2 говорит: «Каждый ассоциативный контейнер параметризуется на Ключ и отношение порядка сравнения, которое индуцирует строгий слабый порядок (25.3) на элементах Key». Я думаю, мы можем считать, что компаратор вызывает строгий слабый порядок на объектах , которые являются элементами контейнера, не обязательно на всех объектах типа Key
. Например, если ключ является указателем, то я уверен, что писать компаратор, который разыгрывает его, хорошо, если вы не используете нулевой указатель в качестве ключа. По тем же соображениям, я надеюсь, что мы можем изменить ключ, который не находится в контейнере.
[*] под «изменить», я имею в виду все, что меняет результаты компаратора с этим ключом и другим ключом. В этом случае, конечно, вы действительно не модифицируете сам ключ (это всего лишь значение указателя), но это то, что я называю.
Обычно я удаляю его и снова вставляю, но я просто собираюсь поставить это как комментарий вместо ответа, потому что я уверен, что есть лучший способ. –
Я уверен, что вам нужно удалить объект, который должен быть изменен, а затем изменить его, а затем снова вставить. Но сейчас я не могу найти ссылку в спецификации C++, которая говорит, что вы не можете изменить ключ записи в ассоциативном контейнере. –
Возможно, это то, что Стив имел в виду: _ Основным свойством итераторов ассоциативных контейнеров является то, что они перебирают контейнеры в неубывающем порядке ключей, где невозвращение определяется путем сравнения, которое использовалось для . _ – dirkgently