Почему происходит ошибка? КомпилЯтор ругается, не могу удалить от начала списка до текущего эллемента? Как исправить?
std::vector<Location> route;
for (auto & r : route)
for (auto & l : locs)
if (l.enable && l == r)
route.erase(route.begin(), r); //<- Ошибка
Есть две ошибки:
1) vector::erase принимает пару итераторов, а вы пытаететсь передать итератор + значение переменной.
2) Range-base цикл, на самом деле, цикл опирающейся на итераторы, и в качестве скрытой переменной "текущая позиция" также используется итератор. В тоже время vector::erase инвалидирует все итераторы контейнера, а не только те, которые указывают на удаляемые элементы, как вы, вероятно думаете.
Возможные решения: Заменить range-based цикл на цикл с явным итератором, а кроме того, заменить тип контейнера с vector на lis.
Либо заменить range-based цикл на вызов стандартных алгоритмов:
auto condition=[&locs]( const Location& r)->bool{
for (auto & l : locs)
if (l.enable && l == r)
return true;
return false;
}
route.erase( route.rend(), std::find_if( route.rbegin(), route.rend() , condition ));
Сборка персонального компьютера от Artline: умный выбор для современных пользователей