Thrust

◆ unique_by_key() [4/4]

template<typename ForwardIterator1 , typename ForwardIterator2 , typename BinaryPredicate >
thrust::pair<ForwardIterator1,ForwardIterator2> thrust::unique_by_key ( ForwardIterator1  keys_first,
ForwardIterator1  keys_last,
ForwardIterator2  values_first,
BinaryPredicate  binary_pred 
)

unique_by_key is a generalization of unique to key-value pairs. For each group of consecutive keys in the range [keys_first, keys_last) that are equal, unique_by_key removes all but the first element of the group. Similarly, the corresponding values in the range [values_first, values_first + (keys_last - keys_first)) are also removed.

This version of unique_by_key uses the function object binary_pred to test for equality and project1st to reduce values with equal keys.

Parameters
keys_firstThe beginning of the key range.
keys_lastThe end of the key range.
values_firstThe beginning of the value range.
binary_predThe binary predicate used to determine equality.
Returns
The end of the unique range [first, new_last).
Template Parameters
ForwardIterator1is a model of Forward Iterator, and ForwardIterator1 is mutable, and ForwardIterator's value_type is a model of Equality Comparable.
ForwardIterator2is a model of Forward Iterator, and ForwardIterator2 is mutable.
BinaryPredicateis a model of Binary Predicate.
Precondition
The range [keys_first, keys_last) and the range [values_first, values_first + (keys_last - keys_first)) shall not overlap.

The following code snippet demonstrates how to use unique_by_key to compact a sequence of key/value pairs to remove consecutive duplicates.

#include <thrust/unique.h>
...
const int N = 7;
int A[N] = {1, 3, 3, 3, 2, 2, 1}; // keys
int B[N] = {9, 8, 7, 6, 5, 4, 3}; // values
new_end = thrust::unique_by_key(keys, keys + N, values, binary_pred);
// The first four keys in A are now {1, 3, 2, 1} and new_end.first - A is 4.
// The first four values in B are now {9, 8, 5, 3} and new_end.second - B is 4.
See also
unique
unique_by_key_copy
reduce_by_key