Метод erase из vector<string> не принимает параметр string

208
18 ноября 2018, 18:10

В этом отрывке кода не компилируется erase

int countDel = 0;
    for (auto item : Events) {
        for (const string i : item.second) {
            if (predicate(item.first, i)) {
                item.second.erase(i);
                countDel++;
            }
        }
    }
return countDel;

predicate - функция, возвращающая bool

В ошибке пишет:

отсутствуют экземпляры перегруженная функция "std::vector<_Ty, _Alloc>::erase [с _Ty=std::string, _Alloc=std::allocator]", соответствующие списку аргументов

Весь день вчера ломал над эти голову, но к выводу так и не пришел

P.s: Events - map<***, vector<string>>

Answer 1

erase у ветора принимает либо позицию, либо итератор, либо диапазон. Чем из них, по-вашему, является строка? :)

Да и, кстати, item у вас - копия, а не ссылка - так что толку от удаления, буде даже оно выполнялось бы - никакого. Тогда уж используйте for(auto& item : Events)..

Answer 2

При использовании range-based for в общем случае не позволяется удалять элементы из того контейнера, по которому производится итерирование. Range-based for не предназначен для таких применений.

Ваш код, по-видимому, пытается удалить текущий итерируемый элемент, что в любом случае приведет к инвалидации внутреннего итератора range-based for. Это - сразу неопределенное поведение. Поэтому независимо от того, что там у вас за контейнер используется, по ссылке ли, по значению ли, и допускает ли он удаление по значению элемента - все это не важно. Ваш код неработоспособен уже из-за использования range-based for.

Не пытаетесь использовать range-based for там, где он неуместен.

READ ALSO
Взаимодействие с проектором через Ethernet

Взаимодействие с проектором через Ethernet

Имеется проектор Panasonic PT-D4000U с Ethernet подключениемНеобходимо написать приложение на C++ (Qt), которое по локальной сети заходит на страничку проектора,...

231
Закрытие QComboBox для редактирования

Закрытие QComboBox для редактирования

Есть QComboBox, который по дефолту должент быть в состоянии editable, но по нажатию кнопки он должен быть закрыт для редактирования, при этом сохранив...

195
Наследование шаблонных классов [дубликат]

Наследование шаблонных классов [дубликат]

На данный вопрос уже ответили:

193
Как сложить IntPtr + int?

Как сложить IntPtr + int?

Подскажите как прибавить int к IntPtr в Cи языке?

237