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

C++ Set(집합)에서 값을 전달해 특정 요소 삭제하는 방법

C++의 set(집합) 컨테이너에서는 값을 인자로 전달하여 해당 요소를 손쉽게 삭제할 수 있습니다. 예를 들어, {10, 20, 30, 50, 60, 80, 90, 100, 120, 200, 500}과 같은 집합이 있을 때 90을 삭제하면 결과는 다음과 같습니다.

{10, 20, 30, 50, 60, 80, 100, 120, 200, 500}

Set 컨테이너의 특징

C++ STL의 set은 다음과 같은 중요한 특성을 가지고 있습니다.

  • 각 요소는 집합 내에서 단 한 번만 존재할 수 있습니다. 즉, 중복된 값이 저장되지 않습니다.
  • 요소들은 항상 정렬된 상태로 유지됩니다.
  • 한 번 추가된 요소의 값은 수정할 수 없습니다(불변). 대신 기존 요소를 제거하고 새로운 값을 추가하는 방식으로 변경이 가능합니다.

이러한 특징 덕분에 set은 고유한 값들을 정렬된 형태로 관리해야 하는 상황에서 매우 유용하게 활용됩니다.

erase() 메서드로 요소 삭제하기

set에서 특정 값을 삭제하려면 erase() 메서드를 사용하면 됩니다. 이 메서드에 삭제하고자 하는 값을 그대로 전달하면, 해당 값이 집합에서 제거됩니다.

예제 코드

#include<iostream>
#include<set>
using namespace std;

void dispSet(set<int> myset) {
    set<int>::iterator it;
    for (it = myset.begin(); it != myset.end(); ++it)
        cout << ' ' << *it;
    cout << '\n';
}

void deleteUsingValue(set<int> myset, int del_element) {
    cout << "Set before deletion:";
    dispSet(myset);
    myset.erase(del_element);
    cout << "Set after deleting " << del_element << ": ";
    dispSet(myset);
}

int main() {
    set<int> tempSet;
    int arr[] = {10, 20, 30, 50, 60, 80, 90, 100, 120, 200, 500};
    int n = sizeof(arr)/sizeof(arr[0]);
    for (int i = 0; i < n; i++)
        tempSet.insert(arr[i]);
    int del_element = 90;
    deleteUsingValue(tempSet, del_element);
}

실행 결과

Set before deletion: 10 20 30 50 60 80 90 100 120 200 500
Set after deleting 90: 10 20 30 50 60 80 100 120 200 500

코드 설명

  1. dispSet 함수: 반복자(iterator)를 사용하여 집합의 모든 요소를 순회하며 출력합니다.
  2. deleteUsingValue 함수: 삭제 전 집합 상태를 출력하고, erase(del_element)를 호출하여 지정된 값을 삭제한 뒤 결과를 다시 출력합니다.
  3. main 함수: 배열의 요소들을 set에 삽입한 후, 값 90을 삭제하는 작업을 수행합니다.

erase() 메서드는 삭제할 요소가 존재하지 않더라도 오류 없이 안전하게 동작하므로, 별도의 존재 여부 검사 없이 바로 호출해도 됩니다. 또한 set이 내부적으로 균형 이진 트리(레드-블랙 트리)로 구현되어 있기 때문에 삭제 연산은 O(log n)의 시간 복잡도로 효율적으로 처리됩니다.