Как удалять несколько обьектов Range-based цикл

214
11 февраля 2020, 12:10

Почему происходит ошибка? КомпилЯтор ругается, не могу удалить от начала списка до текущего эллемента? Как исправить?

std::vector<Location> route;
for (auto & r : route)
    for (auto & l : locs)
        if (l.enable && l == r) 
            route.erase(route.begin(), r); //<- Ошибка
Answer 1

Есть две ошибки:

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 ));
READ ALSO
Передача параметров. JQuery. Синтаксис

Передача параметров. JQuery. Синтаксис

Так передает нормально, send_gift_account(2432,Вася Пупкин), но нужно, чтобы параметры были в одинарных ковычках send_gift_account('2432','Вася Пупкин')

250
Передача переменных из JS в HTML

Передача переменных из JS в HTML

Нужно сделать так, чтобы в HTML коде (в тексте самой страницы) появлялись определенные значения переменных, которые рассчитываются вjs файле...

242
Валидность даты в JS

Валидность даты в JS

Преподователь придумал заданиеФорма регистрации

323