#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> nums{0,1,0,1,0,1,0};
nums.erase(std::remove(nums.begin(),nums.end(),0),nums.end());
for (int num:nums) {
std::cout << num << " ";
}
std::cout << std::endl;
}
위를 출력해보면 1,1,1로 모든 0이 사라져있다.
그림으로보면
이터레이터는 맨처음과 끝을 가리키고있다.
첫 포인터로 0인 것이 확인이 되면
새로운 포인터로 다른 곳을 가리키게하고 이 곳이 0이 아니라는 것이 확인이 되면
0인 포인터에 0이 아닌 포인터를 move시킨다(int이므로 move는 copy처럼 동작한다)
이후 한 칸씩 옆으로 이동하고 주황포인터가 0인 것이 확인되면 오른쪽으로 이동한다
계속 이동하면서 0이 아닌 것을 찾으면 첫 포인터로 그 값을 move시킨다
이 상태로 다시 모두 한 칸 이동하게되고
주황색 포인터가 0이면 주황색 포인터만 오른쪽으로 이동시키면서 0이 아닌값을 찾다가
맨 끝 이터레이터에 도착하면
현재 가리키는 위치를 리턴하면서 remove 이터레이터는 종료되고 erase가 실행된다.
리턴받은 위치부터 끝까지 삭제해주면서
nums.erase(itr,nums.end());
공간을 3으로 줄여준다
함수형 프로그래밍도 가능한데
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> nums{0,1,0,1,0,1,0};
nums.erase(std::remove_if(nums.begin(),nums.end(),[](int n) {
if (n%2==0) {
return true;
}
}),nums.end());
for (int num:nums) {
std::cout << num << " ";
}
std::cout << std::endl;
}
위와 같이 remove_if와 조건에 람다식[]
을 이용해 함수형 프로그래밍이 가능하다