Ошибка с константной

92
11 мая 2021, 05:30

У меня есть структура, которая хранит событие и флаг является оно последним или нет

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]) ?

Answer 1

Потому что 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; }
};
READ ALSO
Комбинация директив для openmp

Комбинация директив для openmp

К примеру у меня есть некий цикл для распаралеливания:

80
SFML, технический вопрос про белый квадрат

SFML, технический вопрос про белый квадрат

Рассмотрим следующий код:

101
Парсинг QByteArray

Парсинг QByteArray

Есть контейнер, содержащий последовательность байт:

94
Показать/скрыть DIV с помощью радиокнопок

Показать/скрыть DIV с помощью радиокнопок

Я совсем новичок в JS, помогите, пожалуйста, разобраться

89