이 글에서는 C++ STL에서 list remove( ) 함수와 list remove_if( ) 함수가 어떤 기능을 수행하는지 예제와 함께 자세히 알아봅니다.
STL에서 List란 무엇인가?
List(리스트)는 시퀀스 내 어느 위치에서든 상수 시간(constant time)에 요소를 삽입하고 삭제할 수 있는 컨테이너입니다. List는 이중 연결 리스트(doubly linked list)로 구현되어 있으며, 비연속적인 메모리 할당 방식을 사용합니다. 그렇기 때문에 배열(array), 벡터(vector), 덱(deque)에 비해 컨테이너 내 임의의 위치에서 요소를 삽입·추출·이동하는 작업에서 더 우수한 성능을 보입니다.
다만 List는 특정 요소에 직접 접근하는 속도가 느린 편이라는 단점이 있습니다. 또한 forward_list와 유사하지만, forward_list 객체는 단일 연결 리스트(singly linked list)로 구현되어 있어 앞쪽(forward) 방향으로만 순회(iterate)할 수 있다는 차이점이 있습니다.
remove( ) 함수란?
remove( ) 함수는 함수의 매개변수로 전달된 특정 값을 리스트에서 제거하는 데 사용됩니다.
문법(Syntax)
listname.remove(val);
매개변수(Parameter)
val − 리스트에서 제거하고자 하는 값을 의미합니다.
예제
입력 리스트: 1 2 3 3 4 5 출력 새 리스트: 1 2 4 5 → 이 리스트에서는 요소 3이 제거되었습니다. 입력 리스트: 5 6 7 8 8 8 9 출력 새 리스트: 5 7 8 8 8 9 → 이 리스트에서는 요소 6이 제거되었습니다.
구현 접근 방식
먼저 리스트를 선언합니다.
그다음 리스트의 내용을 출력합니다.
마지막으로 remove( ) 함수를 호출하여 원하는 값을 제거합니다.
위와 같은 접근 방식을 사용하면 지정한 요소를 손쉽게 제거할 수 있습니다.
예제 코드
// C++ 코드: STL에서 list remove( ) 함수의 동작 확인
#include<iostream>
#include<list>
using namespace std;
int main(){
list<int> lst = { 21, 24, 28, 26, 27, 25 };
// 리스트 출력
cout << "List: ";
for(auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
// remove( ) 함수 호출
lst.remove(27);
cout << "\nNew List: ";
for(auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
입력 – List: 21 24 28 26 27 25 출력 – New List: 21 24 28 26 25 입력 – List: 45 46 47 48 49 50 출력 – New List: 45 46 48 49 50
remove_if( ) 함수란?
remove_if( ) 함수는 매개변수로 전달된 조건(술어, predicate)에 대해 참(true)을 반환하는 모든 값을 리스트에서 제거하는 데 사용됩니다.
문법(Syntax)
listname.remove_if(predicate);
매개변수(Parameter)
predicate − 제거 기준이 되는 조건식(함수)을 의미합니다.
예제
입력 – List: 5 6 7 8 9 10 출력 – New List: 5 7 9 → 이 리스트에서는 모든 짝수 요소가 제거되었습니다. 입력 – List: 5 10 15 20 25 30 출력 – New List: 5 15 25 → 이 리스트에서는 10으로 나누어지는 모든 요소가 제거되었습니다.
구현 접근 방식
먼저 술어(predicate) 함수를 선언합니다.
그다음 리스트를 선언합니다.
리스트의 내용을 출력합니다.
마지막으로 remove_if( ) 함수를 호출하면서 술어를 매개변수로 전달합니다.
위 접근 방식을 사용하면 주어진 조건에 해당하는 요소를 제거할 수 있습니다. 핵심은 remove_if( ) 함수를 호출할 때 조건 역할을 하는 술어(predicate)를 반드시 매개변수로 전달해야 한다는 점입니다.
예제 코드
// C++ 코드: STL에서 list remove_if( ) 함수의 동작 확인
#include<iostream>
#include<list>
using namespace std;
bool div3(const int& val){
return (val % 3) == 0;
}
int main(){
list<int> lst = { 2, 3, 4, 15, 9, 7, 21, 24, 13 };
cout << "List: ";
for(auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
// remove_if( ) 함수 호출
lst.remove_if(div3);
cout << "\nNew List: ";
for(auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
입력 – List: 2 3 4 15 9 7 21 24 13 출력 – New List: 2 4 7 13
위 예제에서 3으로 나누어 떨어지는 요소들(3, 15, 9, 21, 24)이 모두 제거되고 나머지 요소만 남는 것을 확인할 수 있습니다. 이처럼 remove_if( )를 활용하면 복잡한 조건에 맞는 요소들을 간결하게 삭제할 수 있습니다.