vector
에서 일부 요소를 제거하고이를 remove_if
알고리즘을 사용하여 제거하려고합니다. 하지만 제거 된 요소를 추적하여 나중에 일부 작업을 수행 할 수있게하려고합니다.std :: remove_if를 사용하여 제거 된 요소 추적하기
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
struct IsEven
{
bool operator()(int n)
{
if(n % 2 == 0)
{
evens.push_back(n);
return true;
}
return false;
}
vector<int> evens;
};
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 = f.evens.begin(); it != f.evens.end(); ++it)
{
cout<<*it<<"\n";
}
v.erase(newEnd, v.end());
return 0;
}
을하지만 remove_if
이 내 펑터 오브젝트의 복사 허용, 그래서 저장된 evens
벡터에 액세스 할 수없는 것처럼이 작동하지 않습니다 : 나는 다음과 같은 코드로이 시도. 이것을 성취하는 올바른 방법은 무엇입니까?
P. 예를 들어 짝수와 홀수는 예를 들어 술일뿐입니다. 제 실제 코드는 약간 다릅니다. 따라서 짝수 또는 홀수를 다르게 식별하는 방법을 제안하지 마십시오.
참조로 펑터를 전달할 수 있습니다. 'boost' 또는'C++ 11' ('ref'를 가진 패스)을 사용하여 솔루션을 사용할 수 있습니까? – nabulke
다음과 같이 할 수 있습니다'for (vector :: iterator it = newEnd; it! = v.end(); ++ it) { cout << * it << "\ n"; } –
megabyte1024
@ megabyte1024 : 아니요 작동하지 않습니다. } 'evens'를 포함하지 않고 올바른 결과를 얻으려면 v.erase (newEnd, v.end()); newEnd를 넘어서는 요소는 제거 된 요소가 될 수 없다. – Asha