Проблема, которую я вижу в коде, заключается в том, что вектор evens
, который вы создаете внутри структуры, создается каждый раз, когда его вызывает алгоритм remove_if. Поэтому независимо от того, передадите ли вы функтор в remove_if, он будет каждый раз создавать новый вектор. Таким образом, как только последний элемент удален и когда вызов функции заканчивается и выходит из функции, f.evens всегда будет извлекать пустой вектор. Это можно отсортировать двумя способами:
- Заменить структуру классом и объявить четные как статические (если это то, что вы хотели)
- Или вы можете сделать глобальные события. Я бы лично не рекомендовал это (это делает код плохим, скажите глобальным, если они вам действительно не нужны).
Edit:
В соответствии с предложением Набульке, вы также можете использовать std :: ref, например, std :: ref (f). Это препятствует тому, чтобы вы сделали вектор глобальным, и избавляет от ненужной статики.
Пример того, как сделать его глобальным, выглядит следующим образом:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
vector<int> evens;
struct IsEven
{
bool operator()(int n)
{
if(n % 2 == 0)
{
evens.push_back(n);
return true;
}
return false;
}
};
int main(int argc, char **argv)
{
vector<int> v;
for(int i = 0; i < 10; ++i)
{
v.push_back(i);
}
IsEven f;
vector<int>::iterator newEnd = remove_if(v.begin(), v.end(), f);
for(vector<int>::iterator it = evens.begin(); it != evens.end(); ++it)
{
cout<<*it<<"\n";
}
v.erase(newEnd, v.end());
return 0;
}
Мне кажется, этот код работает нормально. Дайте мне знать, если это не то, что вы хотели.