std::inplace_vector<T,N>::erase
cppreference.net에서
constexpr iterator erase( const_iterator pos );
|
(1) | (C++26부터) |
constexpr iterator erase( const_iterator first, const_iterator last );
|
(2) | (C++26부터) |
컨테이너에서 지정된 요소들을 제거합니다.
1) pos 위치의 요소를 제거합니다.
pos.2) [first, last) 범위의 요소들을 제거합니다.
[first, last).반복자( end() 반복자 포함)와 제거 지점 이후의 요소에 대한 참조는 무효화됩니다.
반복자 pos는 유효하고 역참조 가능해야 합니다. 따라서 end() 반복자(유효하지만 역참조 불가능)는 pos의 값으로 사용할 수 없습니다.
반복자 first는 first == last인 경우 역참조 가능할 필요가 없습니다. 빈 범위를 제거하는 것은 아무 작업도 수행하지 않습니다.
매개변수
| pos | - | 제거할 요소를 가리키는 반복자 |
| first, last | - | 제거할 요소들의 범위 를 정의하는 한 쌍의 반복자 |
| 타입 요구사항 | ||
-
T
가
MoveAssignable
이 아니라면, 동작은 정의되지 않습니다.
|
||
반환값
제거된 마지막 요소 다음의 반복자.
1)
만약
pos
가 마지막 요소를 참조하는 경우,
end()
반복자가 반환됩니다.
2)
제거 전에
last
==
end
(
)
인 경우, 갱신된
end()
반복자가 반환됩니다.
만약
[
first
,
last
)
범위가 비어 있다면,
last
가 반환됩니다.
예외
T
의 할당 연산자에서 예외가 발생하지 않는 한 예외를 던지지 않습니다.
복잡도
선형:
T
의 소멸자 호출 횟수는 삭제된 요소 수와 동일하며,
T
의 할당 연산자는 삭제된 요소 이후 벡터에 남아있는 요소 수만큼 호출됩니다.
참고
컨테이너 요소를 조건자에 따라 제거해야 할 때, 컨테이너를 반복하면서 단항 erase을 호출하는 대신, std::remove()/std::remove_if()와 함께 반복자 범위 오버로드를 일반적으로 사용하여 남은 (제거되지 않은) 요소의 이동 횟수를 최소화합니다. — 이것이 소거-제거 관용구입니다.
std::erase_if()는 소거-제거 관용구를 대체합니다.
예제
이 코드 실행
#include <inplace_vector>
#include <print>
int main()
{
std::inplace_vector<int, 26> 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]
참고 항목
|
특정 조건을 만족하는 모든 요소를 삭제함
(함수 템플릿) |
|
|
내용을 비움
(public member function) |