Thrust

◆ unique_by_key() [2/4]

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

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.

The return value is a pair of iterators (new_keys_last,new_values_last) such that no two consecutive elements in the range [keys_first, new_keys_last) are equal.

This version of unique_by_key uses operator== 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.
Returns
A pair of iterators at end of the ranges [key_first, keys_new_last) and [values_first, values_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.
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(A, A + N, B);
// 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