Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL의 list remove( )와 remove_if( ) 함수 완벽 가이드


이 글에서는 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( )를 활용하면 복잡한 조건에 맞는 요소들을 간결하게 삭제할 수 있습니다.