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 두개만 남는다.
'프로그래밍' 카테고리의 다른 글
가상메모리의 상태를 알아보자! (0) | 2011.03.03 |
---|---|
운영체제 시스템 정보를 알아보자! (0) | 2011.03.03 |
std::string Ogre::String 생성자의 함수호출 낭비 (0) | 2011.02.01 |
std::string 간단히 속도 테스트를 해보았다.. (0) | 2011.02.01 |
Visual Studio 에서 명령 창 도구 사용하는 방법 (0) | 2011.01.28 |
댓글