Использование std::remove_if в C++98

Я искал умный способ стирания некоторых элементов вектора во время итерации и нашел этот вопрос.

Конечно, это не будет работать для меня, так как в C++98 нет лямбд. Поискал информацию по remove_if и нашел ее на cppreferenc e. Вот так выглядит мой код:

#include <algorithm>
#include <vector>

bool isOutageValid(const Outage& outage){
    return outage.getEndTime() >= 0;
}

std::vector<Outage> outages;
// Some stuff to fill the vector

outages.erase(std::remove_if(outages.begin(), outages.end(), isOutageValid));

for(vector<Outage>::iterator o=outages.begin(); o!=outages.end(); o++){
    std::cout << o->getStartTime() << " " << o->getEndTime() << std::endl;
}

Я отлаживаю с 4 выходами в вектор, где я знаю, что первый недействителен, а остальные верны. После выполнения стирания размер вектора равен 3, поэтому он выглядит хорошо. Но если я повторюсь с for Цикл для проверки 3 выходов в векторе, второй был удален вместо первого.

Я даже отладил метод isOutageValid, и он первый единственный, кто возвращает false. Есть ли какая-то ошибка, по которой я скучаю?

2 ответа

Решение

Так должно быть:

outages.erase(std::remove_if(outages.begin, outages.end(), isNotOutageValid), outages.end());

В настоящее время вы отключаете разделы сначала недопустимо, а потом последним (другими словами, ваш предикат инвертируется).
А затем уберите первый элемент (вместо диапазона).

1.Вы забыли указать второй аргумент erase, который является концом диапазона, который стирается:

outages.erase(std::remove_if(outages.begin, outages.end(), isOutageValid), outages.end());

2. Условие недействительно, вы должны отменить его:

 #include <functional>

 outages.erase(std::remove_if(outages.begin, outages.end(), std::not1(std::ptr_fun(&isOutageValid))), outages.end());
Другие вопросы по тегам