Изменить элемент итератором

У меня проблема, когда я хочу изменить элемент набора с помощью итератора. Этот простой код может объяснить, что я хочу сделать.

  set<int> s;
  s.insert(12);

  set<int>::iterator it = s.begin();
  *it = 4; // error C3892: 'it' : you cannot assign to a variable that is const

Почему я не могу изменить значение, на которое указывает обычный итератор, а не const_iterator?

В моем итераторе кода возвращался set:: find(). Возможно, это лучший способ выбрать определенный элемент из набора и изменить его.

Ответ 1

Набор - это упорядоченный контейнер (в частности, они реализованы как сбалансированные двоичные деревья поиска). Если бы вы смогли изменить значение элемента через итератор, инвариант порядка был бы сломан. В зависимости от того, чего вы пытаетесь достичь, вам может быть лучше с другим контейнером или получить значение, удалив элемент и вставив новый элемент в набор.