Namespaces
Variants

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

From cppreference.net

(1)
void unique ( ) ;
(C++20 이전)
size_type unique ( ) ;
(C++20 이후)
(C++26 이후 constexpr)
(2)
template < class BinaryPred >
void unique ( BinaryPred p ) ;
(C++20 이전)
template < class BinaryPred >
size_type unique ( BinaryPred p ) ;
(C++20 이후)
(C++26 이후 constexpr)

컨테이너에서 모든 연속적인 중복 요소를 제거합니다. 동일한 요소 그룹에서 첫 번째 요소만 남깁니다.

1) 다음과 동등함 unique ( std:: equal_to < T > ( ) ) (C++14 이전) unique ( std:: equal_to <> ( ) ) (C++14 이후) .
2) 요소 비교에 p 를 사용합니다.
만약 p 가 동치 관계를 설정하지 않으면, 동작은 정의되지 않습니다.

제거된 요소에 대한 반복자와 참조만 무효화합니다.

목차

매개변수

p - 요소들이 동등하게 취급되어야 할 경우 ​ true 를 반환하는 이항 predicate.

predicate 함수의 시그니처는 다음과 동일해야 합니다:

bool pred ( const Type1 & a, const Type2 & b ) ;

시그니처가 반드시 const & 를 가질 필요는 없지만, 함수는 전달된 객체를 수정해서는 안 되며 값 범주 와 무관하게 (가능하면 const인) Type1 Type2 타입의 모든 값을 수용할 수 있어야 합니다 (따라서 Type1 & 는 허용되지 않으며 , Type1 또한 Type1 에 대해 이동이 복사와 동등하지 않는 한 허용되지 않습니다 (C++11부터) ).
Type1 Type2 타입은 list < T,Allocator > :: const_iterator 타입의 객체가 역참조된 후 두 타입으로 암시적으로 변환될 수 있어야 합니다. ​

타입 요구사항
-
BinaryPred BinaryPredicate 요구사항을 충족해야 합니다.

반환값

(없음)

(until C++20)

제거된 요소의 수.

(since C++20)

복잡도

만약 empty() true 인 경우, 비교가 수행되지 않습니다.

그렇지 않으면, N std:: distance ( begin ( ) , end ( ) ) 로 주어진다고 가정합니다:

1) 정확히 N-1 번의 비교를 operator == 를 사용하여 수행합니다.
2) 정확히 N-1 번의 술어 p 적용.

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_list_remove_return_type 201806L (C++20) 반환 타입 변경

예제

#include <iostream>
#include <list>
std::ostream& operator<< (std::ostream& os, std::list<int> const& container)
{
    for (int val : container)
        os << val << ' ';
    return os << '\n';
}
int main()
{
    std::list<int> c{1, 2, 2, 3, 3, 2, 1, 1, 2};
    std::cout << "Before unique(): " << c;
    const auto count1 = c.unique();
    std::cout << "After unique():  " << c
              << count1 << " elements were removed\n";
    c = {1, 2, 12, 23, 3, 2, 51, 1, 2, 2};
    std::cout << "\nBefore unique(pred): " << c;
    const auto count2 = c.unique([mod = 10](int x, int y)
    {
        return (x % mod) == (y % mod);
    });
    std::cout << "After unique(pred):  " << c
              << count2 << " elements were removed\n";
}

출력:

Before unique(): 1 2 2 3 3 2 1 1 2
After unique():  1 2 3 2 1 2
3 elements were removed
Before unique(pred): 1 2 12 23 3 2 51 1 2 2
After unique(pred):  1 2 23 2 51 2
4 elements were removed

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 1207 C++98 반복자 및/또는 참조가 무효화되는지 여부가
명확하지 않았음
제거된 요소에 대한 반복자와
참조만 무효화됨

참고 항목

범위에서 연속된 중복 요소를 제거합니다
(함수 템플릿)