Std:: set iterator автоматически const

Возможный дубликат:Обновление набора С++ STL утомительно: я не могу изменить элемент на месте

Я извлек проблему и изменил имена и так для упрощения.

В основном я создаю экземпляр класса, и я его запасаю в std:: set, позже я хотел бы иметь ссылку на класс, чтобы я мог проверить его значения и изменить их...

Упрощенный код:

MyClass tmpClass;
 std::set<myclass> setMyClass;
 setMyClass.insert(tmpClass);
 std::set<myclass>::iterator iter;
 iter=setMyClass.begin();
 MyClass &tmpClass2=*iter;
</myclass></myclass>

и ошибка:

error C2440: 'initializing' : cannot convert from 'const MyClass' to 'MyClass &'

(Я также удалил часть сообщения об ошибке "MVB:: Run::" ).

если я добавлю предыдущую "константу" в последнюю строку кода, тогда все будет хорошо, но тогда я не могу изменить значение...

Является ли это обычным поведением, и я должен, скажем, удалить данные, изменить значения и вернуть их обратно?

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

2 ответа

Я уверен, что вы won't touch the variables that are used for the sorting можете обойти это, используя const_cast следующим образом:

MyClass tmpClass;
 std::set<myclass> setMyClass;
 setMyClass.insert(tmpClass);
 std::set<myclass>::iterator iter;
 iter=setMyClass.begin();
 const MyClass &tmpClass2=*iter;
 MyClass &tmpClass3 = const_cast<myclass&>(tmpClass2);
</myclass&></myclass></myclass>

Кроме того, вы можете объявить членов класса, которые вы намерены изменить, в качестве mutable.


Да, это ожидается. Если вы смогли отредактировать объекты уже в наборе, прикладной порядок сортировки может больше не применяться, что приведет к поведению undefined.

licensed under cc by-sa 3.0 with attribution.