std::
unique
函数模板 <algorithm>
equality (1) |
template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first, ForwardIterator last); |
predicate (2) |
template <class ForwardIterator, class BinaryPredicate>
ForwardIterator unique (ForwardIterator first, ForwardIterator last,
BinaryPredicate pred); |
删除范围内连续的重复项
从[first,last)范围内的每一组相等元素中除去第一个元素以外的所有元素。
函数不能改变包含元素范围的对象的属性(也就是说,它不能改变数组或容器的大小):
删除是通过用下一个非重复元素替换重复元素来完成的.并通过将迭代器返回到新的结束元素
来通知缩短了范围的新大小。
保留元素的相对顺序,而返回的迭代器和last之间的元素保持有效但未指定的状态。
该函数使用operator==来比较元素对(或版本(2)中的pred)。
这个函数模板的行为相当于:
template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first, ForwardIterator last)
{
if (first==last) return last;
ForwardIterator result = first;
while (++first != last)
{
if (!(*result == *first)) // or: if (!pred(*result,*first)) for version (2)
*(++result)=*first;
}
return ++result; |
☲ 参数
-
first, last
-
指向一个可移动赋值元素序列初始和最终位置的前向迭代器。使用的范围是[first,last),
它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
-
pred
-
二元函数,它接受范围中的两个元素作为参数,并返回可转换为bool的值。
返回的值表明两个参数是否相等(如果为真,它们是相等的,保留其中一个)。
函数不能修改它的任何参数。
它可以是函数指针,也可以是函数对象。
☉ 返回值
指向最后一个元素后面的元素的迭代器。
first和this迭代器之间的范围包括序列中不被认为是重复的所有元素。
☣ 示例
// unique algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::unique, std::distance
#include <vector> // std::vector
bool myfunction (int i, int j) {
return (i==j);
}
int main () {
int myints[] = {10,20,20,20,30,30,20,20,10}; // 10 20 20 20 30 30 20 20 10
std::vector<int> myvector (myints,myints+9);
// using default comparison:
std::vector<int>::iterator it;
it = std::unique (myvector.begin(), myvector.end()); // 10 20 30 20 10 ? ? ? ?
// ^
myvector.resize( std::distance(myvector.begin(),it) ); // 10 20 30 20 10
// using predicate comparison:
std::unique (myvector.begin(), myvector.end(), myfunction); // (no changes)
// print out content:
std::cout << "myvector contains:";
for (it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
} |
输出:
myvector contains: 10 20 30 20 10
✥ 复杂度
对于非空范围,first和last之间的距离线性:比较每一对连续元素,并可能对其中一些执行赋值。
⇄ 数据竞争
范围[first,last)中的对象将被访问并可能被修改。
☂ 异常安全性
如果pred、元素比较、元素赋值或迭代器上的任何操作抛出,则抛出。
注意,无效的参数会导致未定义的行为。
🍄 另请参阅
unique_copy |
复制不重复元素(函数模板) |
adjacent_find |
找出范围内相等的相邻元素(函数模板) |
remove |
覆盖范围中的值(函数模板) |
remove_if |
检查并覆盖范围中的值(函数模板) |