У меня есть структура, которая хранит событие и флаг является оно последним или нет
struct Event{
string event;
bool ch;
};
Также есть класс, как некоторое хранилище
class Data{
public:
void Add(const int& a, Event& ev);
void Last(const int& a);
private:
map<int,set<Event>> m;
};
И функция добавления элемента с флагом, является он последним или нет
void Data::Add( const int& a,Event& ev){
if(m.count(a) > 0){
m[a].insert(ev);
for(auto& val:m[a]){
val.ch=false;
}
ev.ch=true;
}else{
m[a].insert(ev);
ev.ch=true;
}
}
Почему выдает ошибку при изменение параметра ch в цикле for(auto& val:m[a]) ?
Потому что map и set хранят свои элементы в отсортированном порядке, так что их нельзя менять произвольно (ключ в map, элементы в set) - иначе нарушится порядок, а потому они константны. Вы же пытаетесь изменить Event в set - вот компилятор и справедливо возмущен...
Можно выкрутиться, если у вас и правда ch не принимает участия в сравнении и не могут быть два одинаковых события, но с разным ch (словом, сравнение идет только по полю event), объяснив это компилятору:
struct Event{
string event;
mutable bool ch;
bool operator < (const Event& e) const { return event < e.event; }
};
Сборка персонального компьютера от Artline: умный выбор для современных пользователей