Namespaces
Variants

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

From cppreference.net

(1)
void unique ( ) ;
(C++11부터)
(C++20까지)
size_type unique ( ) ;
(C++20부터)
(C++26부터 constexpr)
(2)
template < class BinaryPred >
void unique ( BinaryPred p ) ;
(C++11부터)
(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 타입은 forward_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 <forward_list>
std::ostream& operator<< (std::ostream& os, std::forward_list<int> const& container)
{
    for (int val : container)
        os << val << ' ';
    return os << '\n';
}
int main()
{
    std::forward_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

참고 항목

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