Namespaces
Variants

std::unordered_multiset<Key,Hash,KeyEqual,Allocator>:: erase

From cppreference.net

(1)
iterator erase ( iterator pos ) ;
(C++11부터)
(C++23까지)
iterator erase ( iterator pos )
requires ( ! std:: same_as < iterator, const_iterator > ) ;
(C++23부터)
(C++26부터 constexpr)
iterator erase ( const_iterator pos ) ;
(2) (C++11부터)
(C++26부터 constexpr)
iterator erase ( const_iterator first, const_iterator last ) ;
(3) (C++11부터)
(C++26부터 constexpr)
size_type erase ( const Key & key ) ;
(4) (C++11부터)
(C++26부터 constexpr)
template < class K >
size_type erase ( K && x ) ;
(5) (C++23부터)
(C++26부터 constexpr)

컨테이너에서 지정된 요소들을 제거합니다. 남은 요소들의 순서는 유지됩니다. (이를 통해 컨테이너를 순회하면서 개별 요소를 삭제할 수 있습니다.)

1,2) pos 위치의 요소를 제거합니다.
iterator const_iterator 가 동일한 타입인 경우 오직 하나의 오버로드만 제공됩니다.
3) [ first , last ) 범위에 있는 요소들을 제거합니다. 이 범위는 * this 내에서 유효한 범위여야 합니다.
4) 키가 key 와 동등한 모든 요소를 제거합니다.
5) x 와 비교하여 동등한 모든 키를 가진 요소들을 제거합니다.
이 오버로드는 다음 조건에서만 오버로드 해결에 참여합니다: Hash KeyEqual 가 모두 transparent 이고, iterator const_iterator 모두 K 에서 암시적으로 변환될 수 없는 경우입니다. 이는 해당 Hash K Key 타입 모두에 대해 호출 가능하고, KeyEqual 가 transparent라는 가정 하에, 이 함수를 Key 의 인스턴스를 생성하지 않고 호출할 수 있도록 합니다.

삭제된 요소에 대한 참조와 반복자는 무효화됩니다. 다른 반복자와 참조는 무효화되지 않습니다.

반복자 pos 는 역참조 가능해야 합니다. 따라서 end() 반복자(유효하지만 역참조 불가능한)는 pos 의 값으로 사용할 수 없습니다.

목차

매개변수

pos - 제거할 요소에 대한 반복자
first, last - 제거할 요소들의 범위 를 정의하는 한 쌍의 반복자
key - 제거할 요소들의 키 값
x - 제거할 요소들을 나타내는 키와 투명하게 비교될 수 있는 임의의 타입의 값

반환값

1-3) 제거된 마지막 요소 다음의 반복자.
4) 제거된 요소의 수.
5) 제거된 요소의 수.

예외

1-3) 아무것도 던지지 않습니다.
4,5) Hash KeyEqual 객체에 의해 발생하는 모든 예외.

복잡도

주어진 c 인스턴스는 unordered_multiset 의:

1,2) 평균적인 경우: 상수 시간, 최악의 경우: c. size ( ) .
3) 평균적인 경우: std:: distance ( first, last ) , 최악의 경우: c. size ( ) .
4) 평균적인 경우: c. count ( key ) , 최악의 경우: c. size ( ) .
5) 평균적인 경우: c. count ( x ) , 최악의 경우: c. size ( ) .

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_associative_heterogeneous_erasure 202110L (C++23) 연관 컨테이너와 비정렬 연관 컨테이너에서의 이종 삭제 ; 오버로드 ( 5 )

예제

#include <unordered_set>
#include <iostream>
int main()
{
    std::unordered_multiset<int> c = {1, 2, 3, 4, 1, 2, 3, 4};
    auto print = [&c]
    {
        std::cout << "c = { ";
        for (int n : c)
            std::cout << n << ' ';
        std::cout << "}\n";
    };
    print();
    std::cout << "Erase all odd numbers:\n";
    for (auto it = c.begin(); it != c.end();)
    {
        if (*it % 2 != 0)
            it = c.erase(it);
        else
            ++it;
    }
    print();
    std::cout << "Erase 1, erased count: " << c.erase(1) << '\n';
    std::cout << "Erase 2, erased count: " << c.erase(2) << '\n';
    std::cout << "Erase 2, erased count: " << c.erase(2) << '\n';
    print();
}

가능한 출력:

c = { 1 1 2 2 3 3 4 4 }
Erase all odd numbers:
c = { 2 2 4 4 }
Erase 1, erased count: 0
Erase 2, erased count: 2
Erase 2, erased count: 0
c = { 4 4 }

결함 보고서

다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 수정된 동작
LWG 2059 C++11 오버로드에 모호성이 존재했음 ( 2 ) 오버로드 추가됨 ( 1 )
LWG 2356 C++11 삭제되지 않은 동등하지 않은 요소들의 순서가
보장되지 않았음
보존되도록 요구됨

참고 항목

내용을 지움
(public member function)