Namespaces
Variants

std::list<T,Allocator>:: erase

From cppreference.net

(1)
iterator erase ( iterator pos ) ;
(C++11 이전)
iterator erase ( const_iterator pos ) ;
(C++11 이후)
(C++26 이후 constexpr)
(2)
iterator erase ( iterator first, iterator last ) ;
(C++11 이전)
iterator erase ( const_iterator first, const_iterator last ) ;
(C++11 이후)
(C++26 이후 constexpr)

컨테이너에서 지정된 요소들을 삭제합니다.

1) pos 위치의 요소를 제거합니다.
2) 범위 [ first , last ) 내의 요소들을 제거합니다.

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

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

이터레이터 first 는 역참조 가능할 필요가 없습니다. 만약 first == last 인 경우: 빈 범위를 삭제하는 것은 아무 작업도 수행하지 않습니다.

목차

매개변수

pos - 제거할 요소에 대한 반복자
first, last - 제거할 요소들의 범위 를 정의하는 한 쌍의 반복자

반환값

제거된 마지막 요소 다음의 반복자.

1) 만약 pos 가 마지막 요소를 참조하는 경우, end() 반복자가 반환됩니다.
2) 제거 전에 last == end ( ) 인 경우, 갱신된 end() 반복자가 반환됩니다.
만약 [ first , last ) 가 빈 범위라면, last 가 반환됩니다.

복잡도

1) 상수.
2) first last 사이의 거리에 선형적으로 비례합니다.

참고 사항

컨테이너 요소들을 조건자(predicate)에 기반하여 삭제해야 할 때, 컨테이너를 순회하며 단항 erase 를 호출하는 대신, 일반적으로 반복자 범위 오버로드가 std::remove()/std::remove_if() 와 함께 사용되어 남은 (삭제되지 않은) 요소들의 이동 횟수를 최소화합니다 — 이것이 erase-remove 관용구입니다. std::erase_if() 가 erase-remove 관용구를 대체합니다. (C++20부터)

예제

#include <list>
#include <iostream>
#include <iterator>
void print_container(const std::list<int>& c)
{
    for (int i : c)
        std::cout << i << ' ';
    std::cout << '\n';
}
int main()
{
    std::list<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    print_container(c);
    c.erase(c.begin());
    print_container(c);
    std::list<int>::iterator range_begin = c.begin();
    std::list<int>::iterator range_end = c.begin();
    std::advance(range_begin, 2);
    std::advance(range_end, 5);
    c.erase(range_begin, range_end);
    print_container(c);
    // 모든 짝수 삭제
    for (std::list<int>::iterator it = c.begin(); it != c.end();)
    {
        if (*it % 2 == 0)
            it = c.erase(it);
        else
            ++it;
    }
    print_container(c);
}

출력:

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

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 151 C++98 first 역참조 가능해야 했으며,
이로 인해 빈 list 를 비우는 동작이
정의되지 않음
다음 경우에는 요구되지 않음
first == last

참고 항목

특정 조건을 만족하는 모든 요소를 삭제함
(함수 템플릿)
내용을 비움
(public 멤버 함수)