移除重复元素
移除连续重复元素
unique(beg,end)
unique(beg,end,op)
(1)以上两种形式都会移除连续重复元素中的多余元素;
(2)第一种形式将区间[beg,end)内所有“与前一元素相等”的元素移除;
(3)两种形式都返回被变动后的序列新终点(也就是最后一个“未被移除的元素”的下一个位置);
(4)这两个算法将“原本位置在后”的未被移除元素向前移动,覆盖被移除元素;
(5)未被移除的元素在相对次序上保持不变;
(6)调用者在调用这些算法之后,应保证从此使用返回的新逻辑终点,不再使用原始终点end;
(7)由于会造成元素变动,所以这些算法不可用于关联式容器;
(8)list提供了一个等效成员函数unique(),不是重新赋值元素,而是重新安排指针,因此具有更佳的性能;
(9)复杂度:线性;
代码示例:
#include"fuzhu.h"
using namespace std;
int main()
{
int source[]={1,4,4,6,1,2,2,3,1,6,6,6,5,7,5,4,4};
int sourceNum=sizeof(source)/sizeof(source[0]);
list<int> coll;
copy(source,source+sourceNum,back_inserter(coll));//插入型迭代器
PRINT_ELEMENTS(coll);
list<int>::iterator pos;
pos=unique(coll.begin(),coll.end());
copy(coll.begin(),pos,ostream_iterator<int>(cout," "));
cout<<"\n\n";
copy(source,source+sourceNum,coll.begin());//因为之前已经在coll中放下整个数组,所以此地不需要插入型迭代器
PRINT_ELEMENTS(coll);
coll.erase(unique(coll.begin(),coll.end(),greater<int>()),coll.end());
system("pause");
return 0;
}
运行结果:
运行结果分析:
第一次调用unique()是为了移除连续重复元素。第二次调用则示范unique()第二形式的行为:将"greater比较结果为true"的所有元素移除。该判断式不是用来将元素和其直接前趋元素比较,而是将它和未被移除的前趋元素比较。