본문 바로가기
프로그래밍/c++

stl std::remove의 이해와 활용

by 긱플레이어 2011. 2. 18.

stl std::remove의 이해와 활용

std::remove 함수는
#include <algorithm>
안에 포함되어있다.

std::remove 함수는
각 컨테이너가 가지고있는 erase함수와 다른 동작을 보여준다.

함수의 원형은 이런 식이다.
std::remove( begin, end, val ); // 범위지정... 지울 값.

여기서 착각할수 있는 부분은
std::list 의 remove 함수는 실제로 컨테이너 안에 있는 요소가 삭제가되고
list의 사이즈가 줄어든다..

예로
std::list<int> listTest;
 for ( int i=0; i<10; ++i )
 {
  listTest.push_back(i);
 }

위와같은 list를 출력한다면
0123456789 가 출력된다.
listTest.remove(1);
위 함수를 호출한뒤 컨테이너 값을 출력하면
023456789 이렇게 나오게된다.
실제로 1번이 들어있던 곳이 지워졌다..

하지만 std::remove를 사용하게되면..
std::remove( listTest.begin(), listTest.end(), 1 );
0234567899 이렇게 나오게된다..
전체 요소의 개수가 줄지 않았고..
1은 지워지고... 마지막의 9가 두번 출력되는것도 정상이다.
그 이유는 std::remove의 동작방식이 함수호출시 3번째 인자로 넘어온 데이터와 같은 요소를 찾고
찾은 요소의 다음 요소에서부터 컨테이너의 마지막 요소까지 모두 한칸 앞으로 카피하는 방식이기 때문이다.


결론..
std::list 에서는 remove 함수를 제공하므로 원하는 데이터를 가진 요소를 한꺼번에 모두 제거가능하다.
하지만 std::vector 같은 경우에 원하는 데이터가 들어있는 모든 요소를 지우기위해서는
이런 방식을 사용하면되겠다..

std::vector<int> vec;
vec.push_back(1);
vec.push_back(1);
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.erase( std::remove(vec.begin(),vec.end(),1), vec.end() );
// 결과 2,3 두개만 남는다.




댓글