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

C++ STL forward_list::unique() 함수 완벽 가이드

개요

이번 글에서는 C++에서 forward_list::unique() 함수가 어떻게 동작하는지 알아보겠습니다.

forward_list는 시퀀스 내 어느 위치에서든 상수 시간(O(1))에 삽입과 삭제 연산을 수행할 수 있는 시퀀스 컨테이너입니다. 내부적으로는 단일 연결 리스트(singly linked list)로 구현되며, 각 요소가 다음 요소를 가리키는 링크를 통해 순서가 유지됩니다.

forward_list::unique()는 C++ 표준 라이브러리 함수로, forward_list에서 중복 요소를 제거하는 역할을 합니다. 단, 한 가지 중요한 특징이 있습니다. 어떤 요소는 바로 앞의 요소와 비교했을 때 같은 경우에만 제거됩니다. 즉, 인접한 중복만 걸러내기 때문에 이 함수는 특히 정렬된 리스트에서 빛을 발합니다.

구문

Forwardlist_name.unique(binary_predicate_name)

이진 술어(Binary Predicate) 구문

bool name(data_type a, data_type b)

매개변수 − 이 함수는 매개변수를 하나만 받습니다. 이 매개변수는 두 요소를 같은 값으로 취급해야 할 때 true를 반환하는 이진 술어(binary predicate)입니다.

예시

출력 – List : 4, 4, 17, 32, 45, 56, 56, 45, 32, 4, 17, 17
    unique 연산 수행 후 결과
      Unique list : 4, 17, 32, 45, 56

출력 – List : 15.2, 74.0, 3.14, 15.2, 69.5, 74.0, 3.14, 18.5, 3.99
    unique 연산 수행 후 결과
      Unique list : 3.14, 3.99, 15.2, 18.5, 69.5, 74.0

위 예시처럼 리스트 전체에서 중복을 완전히 제거하려면 sort()로 먼저 정렬한 뒤 unique()를 호출해야 합니다. 정렬 과정에서 같은 값들이 인접하게 모이므로 unique()가 모든 중복을 제거할 수 있습니다.

구현 절차

  • 먼저 이진 술어 함수를 작성합니다.

  • forward_list를 초기화합니다.

  • unique() 함수를 호출합니다.

  • unique 연산 후 forward_list를 출력합니다.

위 절차를 그대로 따르면 forward_list에서 중복 요소를 손쉽게 제거할 수 있습니다.

예제 코드

// C++ 코드로 forward_list::unique()의 동작을 확인합니다
#include <iostream>
#include <forward_list>
using namespace std;

// 이진 술어 함수: 절댓값이 같으면 같은 요소로 판단
bool cmp(int a, int b) {
    return (abs(a) == abs(b));
}

int main() {
    // forward_list 초기화
    forward_list<int> List = { 2, 4, 6, 3, 5, 3, 4, 4, 9, 1, 6, 6, 2, 2, 9 };

    cout << "Elements of List: ";
    for (auto x = List.begin(); x != List.end(); ++x)
        cout << *x << " ";

    // 정렬 후 unique 연산 수행 (이진 술어 사용 시: List.unique(cmp))
    List.sort();
    List.unique();

    cout << "\nUnique List: ";
    for (auto x = List.begin(); x != List.end(); ++x)
        cout << *x << " ";

    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

OUTPUT – List : 2, 4, 6, 3, 5, 3, 4, 4, 9, 1, 6, 6, 2, 2, 9
    Unique List : 1, 2, 3, 4, 5, 6, 9

정리

forward_list::unique()는 인접한 중복 요소를 제거하는 함수입니다. 기본적으로 operator==로 요소를 비교하며, 이진 술어를 인자로 전달하면 사용자가 정의한 기준으로 비교할 수 있습니다. 리스트 전체의 중복을 없애고 싶다면 sort()로 정렬한 뒤 unique()를 호출하는 것이 표준적인 방법입니다.