std::set<Key,Compare,Allocator>:: erase
From cppreference.net
| (1) | ||
|
iterator erase
(
iterator pos
)
;
|
(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) |
| (3) | ||
|
iterator erase
(
iterator first, iterator last
)
;
|
(C++11 이전) | |
|
iterator erase
(
const_iterator first, const_iterator last
)
;
|
(C++11부터)
(C++26부터 constexpr) |
|
|
size_type erase
(
const
Key
&
key
)
;
|
(4) | (C++26부터 constexpr) |
|
template
<
class
K
>
size_type erase ( K && x ) ; |
(5) |
(C++23부터)
(C++26부터 constexpr) |
컨테이너에서 지정된 요소들을 제거합니다.
1,2)
pos
위치의 요소를 제거합니다.
|
|
(C++11부터) |
3)
[
first
,
last
)
범위에 있는 요소들을 제거합니다. 이 범위는
*
this
내에서 유효한 범위여야 합니다.
4)
키가
key
와 동등한 요소가 존재하는 경우 해당 요소를 제거합니다.
5)
값
x
와 비교하여 동등한 모든 키를 가진 요소들을 제거합니다.
이 오버로드는
Compare
가
transparent
이고,
iterator
와
const_iterator
모두
K
에서 암시적으로 변환되지 않는 경우에만 오버로드 해결에 참여합니다. 이를 통해
Key
인스턴스를 생성하지 않고 이 함수를 호출할 수 있습니다.
삭제된 요소에 대한 참조와 반복자는 무효화됩니다. 다른 참조와 반복자는 영향을 받지 않습니다.
반복자 pos 는 역참조 가능해야 합니다. 따라서 end() 반복자(유효하지만 역참조 불가능한)는 pos 의 값으로 사용할 수 없습니다.
목차 |
매개변수
| pos | - | 제거할 요소에 대한 반복자 |
| first, last | - | 제거할 요소들의 범위 를 정의하는 한 쌍의 반복자 |
| key | - | 제거할 요소들의 키 값 |
| x | - | 제거할 요소들을 나타내는 키와 투명하게 비교될 수 있는 임의의 타입의 값 |
반환값
1-3)
제거된 마지막 요소 다음의 반복자.
4)
제거된 요소 개수(0 또는 1).
5)
제거된 요소의 수.
예외
1-3)
아무것도 던지지 않습니다.
4,5)
Compare
객체에 의해 발생하는 모든 예외.
복잡도
주어진 인스턴스
c
의
set
:
1,2)
분할 상환 상수 시간.
3)
log
(
c.
size
(
)
)
+
std::
distance
(
first, last
)
4)
log
(
c.
size
(
)
)
+
c.
count
(
key
)
5)
log
(
c.
size
(
)
)
+
c.
count
(
x
)
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_erasure
|
202110L
|
(C++23) | 연관 컨테이너와 비순차 연관 컨테이너에서의 이종 삭제 ; 오버로드 ( 5 ) |
예제
이 코드 실행
#include <set> #include <iostream> int main() { std::set<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 2 3 4 }
Erase all odd numbers:
c = { 2 4 }
Erase 1, erased count: 0
Erase 2, erased count: 1
Erase 2, erased count: 0
c = { 4 }
결함 보고서
다음 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 |
올바른 동작
|
|---|---|---|---|
| LWG 130 | C++98 |
오버로드
(
1
)
와
(
3
)
의 반환 타입이
void
였음
(시퀀스 컨테이너의
erase()
요구사항과 일관되지 않음)
|
iterator
로 수정됨
|
| LWG 2059 | C++11 | 오버로드 ( 1 ) 를 오버로드 ( 2 ) 로 대체하면서 새로운 모호성이 발생함 | 오버로드 ( 1 ) 를 다시 추가함 |
참고 항목
|
내용을 지움
(public member function) |