Namespaces
Variants

std::erase, std::erase_if(std::list)

From ko.cppreference.net

 
 
 
 
헤더 <list>
template< class T, class Alloc, class U >
std::list<T, Alloc>::size_type
    erase( std::list<T, Alloc>& c, const U& value );
에 정의됨 (1) (C++20부터)
(C++26까지)
template< class T, class Alloc, class U = T >
std::list<T, Alloc>::size_type
    erase( std::list<T, Alloc>& c, const U& value );
(C++26부터)
template< class T, class Alloc, class Pred >
std::list<T, Alloc>::size_type
    erase_if( std::list<T, Alloc>& c, Pred pred );
(2) (C++20부터)
1) 컨테이너에서 value와 같은 모든 요소를 지웁니다. return c.remove_if([&](const auto& elem) -> bool { return elem == value; });와 동일합니다.
2) 컨테이너에서 조건자 pred를 만족하는 모든 요소를 지웁니다. return c.remove_if(pred);와 동일합니다.

매개변수

c - 삭제할 컨테이너
value - 제거할 값
pred - 요소가 삭제되어야 할 경우 ​ true 를 반환하는 단항 predicate.

표현식 pred ( v ) 는 bool 로 변환 가능해야 하며, v 의 값 카테고리 와 무관하게 (const 가능성이 있는) T 타입의 모든 인수 v 에 대해 v 를 수정해서는 안 됩니다. 따라서 T & 매개변수 타입은 허용되지 않으며 , T 에 대해 이동이 복사와 동등하지 않는 한 T 타입도 허용되지 않습니다 (C++11부터) . ​

반환값

삭제된 요소의 수.

복잡도

선형.

참고 사항

std::list::remove 와 달리, erase 는 이종 타입을 허용하며 == 연산자를 호출하기 전에 컨테이너의 값 타입으로 변환을 강제하지 않습니다.

기능 테스트 매크로 값 표준 기능
__cpp_lib_algorithm_default_value_type 202403 (C++26) 목록 초기화 for std::erase

예제

#include <complex>
#include <numeric>
#include <print>
#include <list>

template<typename T>
struct std::formatter<std::complex<T>, char>
{
    template<class ParseContext>
    constexpr ParseContext::iterator parse(ParseContext& ctx)
    {
        return ctx.begin();
    }

    template<class FmtContext>
    FmtContext::iterator format(const auto& s, FmtContext& ctx) const
    {
        auto out{std::format("({},{})", s.real(), s.imag())};
        return std::ranges::copy(std::move(out), ctx.out()).out;
    }
};

int main()
{
    std::list<char> cnt(10);
    std::iota(cnt.begin(), cnt.end(), '0');
    std::println("Initially, cnt = {}", cnt);

    std::erase(cnt, '3');
    std::println("After erase '3', cnt = {}", cnt);

    auto erased = std::erase_if(cnt, [](char x) { return (x - '0') % 2 == 0; });
    std::println("After erase all even numbers, cnt = {}", cnt);
    std::println("Erased even numbers: {}", erased);

    std::list<std::complex<double>> nums{{2, 2}, {4, 2}, {4, 8}, {4, 2}};
    #ifdef __cpp_lib_algorithm_default_value_type
        std::erase(nums, {4, 2});
    #else
        std::erase(nums, std::complex<double>{4, 2});
    #endif
    std::println("After erase {{4, 2}}, nums = {}", nums);
}

출력:

Initially, cnt = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
After erase '3', cnt = [0, 1, 2, 4, 5, 6, 7, 8, 9]
After erase all even numbers, cnt = [1, 5, 7, 9]
Erased even numbers: 5
After erase {4, 2}, nums = [(2,2), (4,8)]

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 4135 C++20 사용된 람다 predicate의 반환 타입이
predicate 인수들로부터 추론됨
반환 타입이
명시적으로 bool 으로 지정됨

참고 항목

특정 조건을 만족하는 요소를 제거합니다
(공개 멤버 함수)
특정 조건을 만족하는 요소를 제거합니다
(함수 템플릿 & 알고리즘 함수 객체)
특정 조건을 만족하는 요소를 제거합니다
(알고리즘 함수 객체)