Предположим, у меня есть структура с именем "ClientInfo". Эта структура содержит некоторую информацию о некотором cl inet. И предположим, что каждый клиент имеет постоянный идентификатор и некоторую другую информацию, такую как «Адрес» или «Баланс», которую можно изменить. Если я хочу хранить информацию о клиентах в каком-то контейнере, который дает мне вставку / удаление log (n), то я думаю, что std :: set является наиболее подходящим. Но, к сожалению, набор не позволяет изменять какой-либо элемент внутри него, даже если изменение не повлияет на порядок (я думаю). Я искал в inte rnet решения, и все, что я нашел, было одно из следующего:
- Использовать 'mutable'
- Использовать const_cast
- You можно стереть и вставить снова (O (1))
- Вы можете использовать std :: map
-
1/2 - я не думаю, Я собираюсь использовать первые два варианта, потому что я не хочу связываться с константностью моей программы.
3 - Кроме того, я думаю, что даже если стирание и вставка - это O (1), я думаю, если бы я мог просто изменить элемент, это было бы быстрее.
4 - Также я не думаю, std :: map - правильный выбор, так как я хочу получить доступ к идентификатору клиента. Если я использую std :: map, у меня есть два варианта:
- Чтобы дважды скопировать идентификатор, Один раз для ключа карты и Один раз внутри структуры.
- Чтобы взять отключить идентификатор из структуры, чтобы избежать дублирования, но в этом случае у меня не будет прямого доступа к идентификатору клиента внутри структуры.
Очевидно, что я не хочу скопируйте идентификатор, так как это может быть что-то дорогое, например, std :: string или какой-то объект.
-
Итак, мой вопрос: как изменить элемент внутри std :: set напрямую, без использования 'mutable' или 'const_cast', без стирания и вставки снова и без использования std: :карта? Как сказать std :: set, что идентификатор является константой и что это единственное, что влияет на порядок элементов, и указать ему разрешить изменять что-либо еще, кроме идентификатора?