Как изменить элемент set?

#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!