В этом отрывке кода не компилируется 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>>
erase у ветора принимает либо позицию, либо итератор, либо диапазон. Чем из них, по-вашему, является строка? :)
Да и, кстати, item у вас - копия, а не ссылка - так что толку от удаления, буде даже оно выполнялось бы - никакого. Тогда уж используйте for(auto& item : Events)..
При использовании range-based for в общем случае не позволяется удалять элементы из того контейнера, по которому производится итерирование. Range-based for не предназначен для таких применений.
Ваш код, по-видимому, пытается удалить текущий итерируемый элемент, что в любом случае приведет к инвалидации внутреннего итератора range-based for. Это - сразу неопределенное поведение. Поэтому независимо от того, что там у вас за контейнер используется, по ссылке ли, по значению ли, и допускает ли он удаление по значению элемента - все это не важно. Ваш код неработоспособен уже из-за использования range-based for.
Не пытаетесь использовать range-based for там, где он неуместен.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей