더북(TheBook)

2.5.3 원소를 제거하기

리스트 컨테이너의 clear(), erase() 함수 멤버도 앞서 설명한 순차열 컨테이너와 같이 동작하며, 결과도 같다. 리스트 컨테이너의 remove() 멤버는 인수와 일치하는 원소들을 제거한다.

std::list<int> numbers { 2, 5, 2, 3, 6, 7, 8, 2, 9};
numbers.remove(2);             // 이제 리스트는 5 3 6 7 8 9

두 번째 문장은 numbers에서 값이 2인 모든 원소를 제거한다.

remove_if() 함수 멤버는 인수로 단항 조건자(unary predicate)를 사용한다. 단항 조건자는 원소 타입이나 원소 타입의 const 참조를 인수로 받고 bool 값을 반환한다. 조건자에서 true를 반환하는 원소는 모두 제거된다.

numbers.remove_if([](int n){ return n%2 == 0;}); // 짝수 제거, 결과는 5 3 7 9

여기서 인수는 람다 표현식이지만, 함수 객체를 사용할 수도 있다.

unique() 함수 멤버도 흥미롭다. unique()는 인접 중복 원소를 제거한다. 즉, 둘 이상 중복 원소 중에 첫 번째만 남겨둔다.

std::list<std::string> words {"one", "two", "two", "two", "three", "four", "four"};
words.unique();                       // "one" "two" "three" "four"

여기서 unique()는 인접 원소를 비교하는 데 == 연산자를 사용했다. 순차열에서 모든 중복 원소를 제거하고 싶다면 원소들을 정렬한 후에 unique()를 적용할 수도 있다.

unique()의 오버로드는 인수로 이항 조건자(binary predicate)를 받는다. 이항 조건자가 true를 반환하는 원소들은 같은 것으로 간주된다. 이를 이용하면 상등관계(equality)를 매우 유연하게 처리할 수 있다. 길이가 같은 문자열이나 약자가 같은 문자열을 동등한 것으로 처리할 수도 있다. 리스트의 반복자를 역참조한 결과가 다른 타입으로 암묵적으로 변환될 수 있다면 조건자는 다른 타입을 매개변수로 쓸 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.