home | help
std::list::unique(3)	       C++ Standard Libary	    std::list::unique(3)

NAME
     std::list::unique - std::list::unique

Synopsis
	void unique();				       (until C++20)
	size_type unique();			       (since C++20)
	template<  class  BinaryPredicate  >	   (1)			  (until
     C++20)
	void unique( BinaryPredicate p );	   (2)
	template<  class  BinaryPredicate  >				  (since
     C++20)
	size_type unique( BinaryPredicate p );

	Removes  all consecutive duplicate elements from the container. Only the
     first
	element in each group of equal elements is left.  Invalidates  only  the
     iterators and
	references to the removed elements.

	1) Uses operator== to compare the elements.
	2) Uses p to compare the elements.

	The  behavior  is undefined if the corresponding comparator does not es-
     tablish an
	equivalence relation.

Parameters
	    binary predicate which  returns  true  if  the  elements  should  be
     treated as equal.

	    The  signature of the predicate function should be equivalent to the
     following:

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

	    While the signature does not need to have const &, the function must
     not modify
	p - the objects passed to it and must be able to accept  all  values  of
     type (possibly
	    const)  Type1  and Type2 regardless of value category (thus, Type1 &
     is not
	    allowed
	    , nor is Type1 unless for Type1 a move is equivalent to a copy
	    (since C++11)).
	    The types Type1 and Type2 must be such that an object of type
	    list<T,Allocator>::const_iterator can be dereferenced and  then  im-
     plicitly
	    converted to both of them.

Type requirements
	-
	BinaryPredicate must meet the requirements of BinaryPredicate.

Return value
	(none)				(until C++20)
	The number of elements removed. (since C++20)

Complexity
	If empty() is true, no comparison is performed.

	Otherwise, given \(\scriptsize N\)N as std::distance(begin(), end()):

	1) Exactly \(\scriptsize N-1\)N-1 comparisons using operator==.
	2) Exactly \(\scriptsize N-1\)N-1 applications of the predicate p.

Notes
	       Feature-test macro	   Value    Std 	 Feature
	__cpp_lib_list_remove_return_type 201806L (C++20) Change the return type

Example
     // Run this code

      #include <iostream>
      #include <list>

      std::ostream&  operator<<  (std::ostream&  os,  std::list<int> const& con-
     tainer)
      {
	  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";
      }

Output:
      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

       Defect reports

	The following behavior-changing defect	reports  were  applied	retroac-
     tively to
	previously published C++ standards.

	   DR	 Applied to	  Behavior as published 	     Correct be-
     havior
			    it	was  unclear whether iterators	only invalidates
     iterators and
	LWG 1207 C++98	    and/or references will be	      references to  the
     removed
			    invalidated 		      elements

See also
	unique removes consecutive duplicate elements in a range
	       (function template)

http://cppreference.com 	   2024.06.10		    std::list::unique(3)

home | help