std::hive<T,Allocator>::erase
cppreference.net에서
iterator erase( const_iterator pos );
|
(1) | (C++26부터) |
iterator erase( const_iterator first, const_iterator last );
|
(2) | (C++26부터) |
컨테이너에서 지정된 요소들을 제거합니다.
1)
pos의 요소를 제거합니다.2) 범위
[first, last)의 요소들을 제거합니다.제거된 요소에 대한 반복자와 참조자는 무효화됩니다. 요소가 컨테이너의 마지막 요소인 경우, end() 반복자도 무효화됩니다. 다른 참조자와 반복자는 영향을 받지 않습니다.
반복자 pos는 유효하고 역참조 가능해야 합니다. 따라서 end() 반복자(유효하지만 역참조 가능하지 않음)는 pos의 값으로 사용될 수 없습니다.
반복자 first는 first == last인 경우 역참조 가능할 필요가 없습니다: 빈 범위를 지우는 것은 아무 작업도 하지 않습니다.
매개변수
| pos | - | 제거할 요소를 가리키는 반복자 |
| first, last | - | 제거할 요소들의 범위를 정의하는 반복자 쌍 |
반환값
마지막으로 제거된 요소 다음의 반복자.
1)
pos가 마지막 요소를 가리키면, end() 반복자가 반환됩니다.2)
last == end()가 제거 전에 컨테이너의 끝을 가리키는 경우, 갱신된 end() 반복자가 반환됩니다. 만약
[first, last)가 빈 범위이면, last이 반환됩니다.복잡도
1) 상수 시간.
2) 제거된 요소의 개수에 선형.
추가로, 함수 호출 결과로 어떤 활성 블록이 요소가 비게 되면, — 최악의 경우 요소 블록의 개수에 선형.
참고
컨테이너 요소를 조건자에 기반하여 제거해야 할 때, 컨테이너를 반복하며 단일 erase을 호출하는 대신, 일반적으로 반복자 범위 오버로드를 std::remove()/std::remove_if()와 함께 사용하여 남은(제거되지 않은) 요소의 이동 횟수를 최소화합니다. — 이것이 erase-remove 관용구입니다.std::erase_if()는 erase-remove 관용구를 대체합니다.
예제
이 코드 실행
#include <hive>
#include <print>
int main()
{
std::hive v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::println("{}", v);
v.erase(v.begin());
std::println("{}", v);
v.erase(std::next(v.begin(), 2), std::next(v.begin(), 5));
std::println("{}", v);
// Erase all even numbers
for (auto it{v.begin()}; it != v.end();)
if (*it % 2 == 0)
it = v.erase(it);
else
++it;
std::println("{}", v);
}
출력:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 6, 7, 8, 9]
[1, 7, 9]
더 보기
| 특정 기준을 만족하는 모든 요소를 제거합니다. (함수 템플릿) | |
| 내용을 지웁니다. (공개 멤버 함수) |