erase, loop

김대익·2022년 3월 15일
0
#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와 조건에 람다식[]을 이용해 함수형 프로그래밍이 가능하다

0개의 댓글