#c #iterator #set
#c #установить #const-итератор
Вопрос:
Я хочу изменить элемент в a set
, поэтому я использовал set<T>::iterator
. Однако компилятор утверждает, что «элемент является const». Затем я понял, что set<T>::iterator
это const_iterator
…
Итак, как я могу изменить элемент? Стереть его, а затем вставить новый?
Ответ №1:
Элементы set
будут в отсортированном порядке. Если вам разрешено изменять элемент, то этот порядок сортировки не может поддерживаться. Следовательно, вы не можете изменить элемент. Вам нужно удалить существующий элемент и вставить новый.
Комментарии:
1. Однако следует отметить, что некоторые изменения в элементе не влияют на то, как он сортируется. Если вы хотите внести изменения, которые, как вы уверены, не повлияют на порядок сортировки, всегда
const_cast
есть последнее средство. Рискованно и некрасиво, но тем не менее.2. Спасибо. Я это знаю . Значит, это единственный способ изменить элемент?
3. Поскольку
erase
не выдает, если вызываемый им пользовательский код не выдает, вероятно, лучше вставить новый элемент, а затем удалить старый. Это дает вам шанс на надежную гарантию исключения.4. std::unordered_set ..впервые слышу это
Ответ №2:
Элементы Set являются постоянными и не могут быть изменены на месте. Модификация может изменить предикат упорядочения без изменения положения элемента, что нарушит ограничения структуры данных.
Однако теперь в будущем (C 17) изменение элемента без удаления возможно с extract
помощью функции-члена:
std::set<std::string> stringset{"a", "b", "c"};
auto node = stringset.extract(stringset.begin());
std::stringamp; str = node.value();
str = "d";
stringset.insert(std::move(node));
Все еще существует стоимость операций со списком, но сам объект не уничтожается и не копируется.
Ответ №3:
РЕДАКТИРОВАТЬ: вы не можете добавить элемент в определенное место в set. набор должен быть в отсортированном порядке, какие бы операции вы ни выполняли. Итак, вам нужно стереть конкретный элемент и вставить новый элемент, чтобы порядок set не был потерян.
Также читайте больше о set!