English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C++ set erase() 사용 방법 및 예제

C++ STL Set(집합)

C ++ set erase())함수는 주어진 키와 연관된 단일 요소 또는 요소 범위([first, last)를 set 컨테이너에서 지우기 위해 사용됩니다. 따라서 요소의 수를 통해 크기를 줄입니다。

문법

void erase(iterator position);                       	  //C++ 11 이전
size_type erase(const value_type& val);    		  //C++ 11 이전
void erase(iterator first, iterator last);  		  //C++ 11 이전
iterator erase(const_iterator position);		  //C++ 11시작
size_type erase(const value_type& val);		  //C++ 11시작	
iterator erase(const_iterator first, const_iterator last); //C++ 11시작

파라미터

position:집합에서 지우려는 단일 요소를 가리키는 이터레이터

val:집합에서 지우려는 값

first:지우려는 범위의 시작

last:지우려는 범위의 끝

반환 값

이 함수는 지워진 요소의 다음 요소에 대한 이터레이터를 반환하거나, 지워진 요소의 수를 반환합니다。

복잡

erase(position):摊销常数

erase(val):컨테이너 크기의 로그

erase(first,last):처음과 마지막의 거리는 선형입니다。

이터레이터 효력

이터레이터, 참조 및 이 함수로 지워진 요소를 가리키는 포인터는 무효가 됩니다。

모든 다른 이터레이터, 포인터 및 참조는 그 효력을 유지합니다。

데이터 경쟁

컨테이너가 변경되었습니다。

지워진 요소는 변경됩니다. 다른 요소에 대한 동시 접근은 안전하지만, 컨테이너에서 이터레이션 범위는 안전하지 않습니다。

예외 안전

이 함수는 예외를 발생시키지 않습니다。

잘못된 범위나 위치를 지정하면 정의되지 않은 행동이 발생할 수 있습니다。

예제1

이제 이터레이터로 요소를 지우는 간단한 예제를 보여드리겠습니다。

#include <iostream>
#include <set>
using namespace std;
int main () {
    set<int> myset;
    set<int>::iterator it;
    myset = {
        10,20,30
    }
    ;
    cout << "요소를 제거하기 전:\n";
    for (it = myset.begin(); it != myset.end(); ++it)
        cout << *it << '\n';
    it=myset.find('b');
    myset.erase(*it);
    // 이터레이터로 지우기
    cout<<"\n요소를 지우고 나서: \n";
    for (it = myset.begin(); it != myset.end(); ++it)
        cout << *it << '\n';
    return 0;
}

출력:

요소를 제거하기 전: 
10
20
30
요소를 지우고 나서: 
10
20
30

위의 예제에서 요소는 이터레이터로 지워졌습니다。

예제2

이제 주어진 키 값으로 집합에서 요소를 지우는 간단한 예제를 보여드리겠습니다:

#include <iostream>
#include <set>
using namespace std;
int main()
{
  set<int> myset;
  set<int>::iterator it;
  myset = {10, 20, 30, 40});
  
  cout << "요소를 제거하기 전:\n";
   for (it = myset.begin(); it != myset.end(); ++it){
     cout << *it<<'\n';
   }
  
   myset.erase(30);//지정된 값을 지우는 것
  cout << "\n요소를 제거한 후:\n";
  for (it = myset.begin(); it != myset.end(); ++it){
      cout << *it<<'\n';
  }
    
  return 0;
}

출력:

요소를 제거하기 전: 
10
20
30
40
요소를 제거한 후: 
10
20
40

위의 예제에서 erase(value) 함수는 집합의 값으로30。

예제3

이제 간단한 예제를 보여드리겠습니다. 주어진 범위로 요소를 지우는 것을 보여드리겠습니다:

#include <iostream>
#include <set>
using namespace std;
int main () {
    set<int> myset;
    set<int>::iterator it;
    myset = {
        10, 20, 30
    };
    cout << "요소를 제거하기 전:\n";
    cout << "Size is: " << myset.size() << '\n';
    for (it = myset.begin(); it != myset.end(); ++it){
       cout << *it << '\n';
    }
      
    myset.erase(myset.begin(), myset.end());
    // 지정된 범위를 지우기
    cout << "\n요소를 제거한 후:\n";
    cout << "Size is: " << myset.size();
    for (it = myset.begin(); it != myset.end(); ++it){
       cout << *it << '\n';
    } 
    return 0;
}

출력:

요소를 제거하기 전: 
Size is: 3
10
20
30
요소를 제거한 후: 
Size is: 0

위 예제에서는 Erase(first, last) 함수를 사용하여 지정된 범위(즉 시작부터 끝까지)의 요소를 지우었습니다.

예제4

m에서 모든 홀수를 제거하는 간단한 예제를 보겠습니다:

#include <set>
#include <iostream>
using namespace std;
int main()
{
    set<int> m = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
                          
    // m에서 모든 홀수를 제거
    cout << "홀수를 제거한 후 요소는:\n \t ";
    for (auto it = m.begin(); it != m.end();){
        if (*it %% 2 == 1{
            it = m.erase(it);
        } else {
            ++it;
        }
     }
    for (auto& p : m) {
       cout << p << ", ";
     }
}

출력:

홀수를 제거한 후 요소는:
 2, 4, 6, 8, 10, 12, 14,

위 예제에서 모든 홀수가 제거되었으며 짝수가 표시되었습니다.

예제5

다른 예제를 보겠습니다:

#include <set>  
#include <string>  
#include <iostream>  
#include <iterator> // next()과 prev() 보조 함수 
  
using namespace std;  
  
using myset = set<string>;  
  
void printset(const myset& s) {  
    for (const auto& iter : s) {  
        cout << " [" << iter << "]";  
    }  
    cout << endl << "size() == " << s.size() << endl << endl;  
}  
  
int main()  
{  
    myset s1;  
  
    // 데이터를 입력하여 테스트합니다, 하나씩
    s1.insert("Bob");  
    s1.insert("Robert");  
    s1.insert("Bert");  
    s1.insert("Rob");  
    s1.insert("Bobby");  
  
    cout << "집합 s1의 시작 데이터는: " << endl;  
    printset(s1);  
    // 의 첫 번째 멤버 함수는 주어진 위치의 요소를 제거합니다  
    s1.erase(next(s1.begin()));  
    cout << "삭제 번호가 "2요소 후, 집합 s1이":" << endl;  
    printset(s1);  
  
    // 초기화자 목록을 사용하여 하나의 데이터를 한 번에 입력합니다
    myset s2{ "meow", "hiss", "purr", "growl", "yowl" };  
  
    cout << "집합 s2의 시작 데이터는: " << endl;  
    printset(s2);  
    // 의 두 번째 멤버 함수는 요소를 제거합니다 
    // 범위 [First, Last)  
    s2.erase(next(s2.begin()), prev(s2.end()));  
    cout << "중간 요소를 제거한 후, 집합 s2이":" << endl;  
    printset(s2);  
  
    myset s3;  
  
    // 하나의 데이터를 사용하여 테스트 데이터를 한 번에 입력합니다 
    s3.emplace("C");  
    s3.emplace("C#");  
    s3.emplace("D");  
    s3.emplace("D#");  
    s3.emplace("E");  
    s3.emplace("E#");  
    s3.emplace("F");  
    s3.emplace("F#");  
    s3.emplace("G");  
    s3.emplace("G#");  
    s3.emplace("A");  
    s3.emplace("A#");  
    s3.emplace("B");  
  
    cout << "집합 s3의 시작 데이터는: " << endl;  
    printset(s3);  
    // 의 세 번째 멤버 함수는 주어진 키를 가진 요소를 제거합니다 
    myset::size_type count = s3.erase("E#");  
    // 의 세 번째 멤버 함수도 제거된 요소 수를 반환합니다
    cout << "s3에서 제거된 요소 수는: " << count << "." << endl;  
    cout << "삭제 키가 "E#"인 요소 후, 집합 s3이":" << endl;  
    printset(s3);  
}

출력:

集合s1의 시작 데이터는:
 [Bert] [Bob] [Bobby] [Rob] [Robert]
size() == 5
번 요소를 제거한 후2요소 후, 집합 s1위치:
 [Bert] [Bobby] [Rob] [Robert]
size() == 4
集合s2의 시작 데이터는:
 [growl] [hiss] [meow] [purr] [yowl]
size() == 5
중간 요소를 제거한 후, 집합s2위치:
 [growl] [yowl]
size() == 2
集合s3的开始数据为:
 [A] [A#] [B] [C] [C#] [D] [D#] [E] [E#] [F] [F#] [G] [G#]
size() == 13
从s3中删除的元素数量为: 1.
키值为“E#”的元素删除后,集合s3위치:
 [A] [A#] [B] [C] [C#] [D] [D#] [E] [E#] [F] [F#] [G] [G#]
size() == 12

C++ STL Set(집합)