Изменение элемента в std::set
может привести к нарушению внутреннего порядка и повреждению вашей структуры данных.Только некоторые реализации STL защищают от этого, не позволяя модифицировать то, на что указывает iterator
, поэтому вам придется применять это ограничение самостоятельно.
Это похоже на запись за логический конец std::vector
путем вызоваreserve
(чтобы освободить место) и используя арифметику указателей - вы можете сделать это, но это повредит ваш std::vector
.
Если вы хотите изменить элемент в наборе, это должно работать:
std::set<int> my_set;
// initialize my_set ...
std::set<int>::iterator itr = my_set.find(10);
if (itr != my_set.end()) {
my_set.erase(itr++); // ++ avoids invalidating iterator
my_set.insert(3);
}
Вам нужно только после увеличения itr
, если вы хотите продолжать использовать его.
(источник: Действующий STL , "Item 22", СкоттMeyers)