Namespaces
Variants

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

From cppreference.net

헤더 파일에 정의됨 <list>
(1)
template < class T, class Alloc, class U >

typename std:: list < T, Alloc > :: size_type

erase ( std:: list < T, Alloc > & c, const U & value ) ;
(C++20부터)
(C++26까지)
template < class T, class Alloc, class U = T >

constexpr typename std:: list < T, Alloc > :: size_type

erase ( std:: list < T, Alloc > & c, const U & value ) ;
(C++26부터)
template < class T, class Alloc, class Pred >

typename std:: list < T, Alloc > :: size_type

erase_if ( std:: list < T, Alloc > & c, Pred pred ) ;
(2) (C++20부터)
(C++26부터 constexpr)
1) 컨테이너 c 에서 value 와 비교하여 동일한 모든 요소를 삭제합니다. 다음 코드와 동일합니다: return c. remove_if ( [ & ] ( const auto & elem ) - > bool { return elem == value ; } ) ; .
2) 컨테이너 c 에서 조건자 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 <iostream>
#include <numeric>
#include <string_view>
#include <list>
void println(std::string_view comment, const auto& c)
{
    std::cout << comment << '[';
    bool first{true};
    for (const auto& x : c)
        std::cout << (first ? first = false, "" : ", ") << x;
    std::cout << "]\n";
}
int main()
{
    std::list<char> cnt(10);
    std::iota(cnt.begin(), cnt.end(), '0');
    println("Initially, cnt = ", cnt);
    std::erase(cnt, '3');
    println("After erase '3', cnt = ", cnt);
    auto erased = std::erase_if(cnt, [](char x) { return (x - '0') % 2 == 0; });
    println("After erase all even numbers, cnt = ", cnt);
    std::cout << "Erased even numbers: " << erased << '\n';
    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
    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 으로 지정됨

참고 항목

특정 조건을 만족하는 요소들을 제거함
(함수 템플릿)
특정 조건을 만족하는 요소들을 제거함
(알고리즘 함수 객체)
특정 조건을 만족하는 요소들을 제거함
(public 멤버 함수)