unique:移除连续重复元素的多余元素
// TEMPLATEFUNCTION unique
template<class_FwdIt> inline
_FwdIt _Unique(_FwdIt _First, _FwdIt_Last)
{ // remove each matching previous
if(_First != _Last)
for(_FwdIt _Firstb; (_Firstb = _First), ++_First != _Last; )
if (*_Firstb == *_First)//找到相等的两个元素
{ // copy down
for (; ++_First != _Last; )
if (!(*_Firstb == *_First))//继续往下找,如果没有找到,将__First后面的元素,移动
//到_Firstb的后面.否则,查找下一个.
*++_Firstb= _Move(*_First);
return (++_Firstb);
}
return(_Last);
}
//TEMPLATE FUNCTION unique WITH PRED
template<class _FwdIt,
class_Pr> inline
_FwdIt _Unique(_FwdIt _First, _FwdIt_Last, _Pr _Pred)
{ // remove each satisfying _Pred with previous
if(_First != _Last)
for(_FwdIt _Firstb; (_Firstb = _First), ++_First != _Last; )
if (_Pred(*_Firstb, *_First))//找到使得_Pred为真的元素
{ // copy down
for (; ++_First != _Last; )
if (!_Pred(*_Firstb, *_First))//继续往下找,如果没有找到满足条件的两个元素,则
//将后面的元素移动到_Firstb的后面.否则,查找下一个.
//这里需要注意的是,如果找到满足条件的元素后,
//参考元素_Firstb的值是不变的.
*++_Firstb= _Move(*_First);
return (++_Firstb);
}
return(_Last);
}
注意:
◆ 要想使得unique移除容器内所有相等的元素.该容器一定要有序.
◆ list元素有自己的unique.
◆ 不能针对关联容器进行此操作.
举例:
int main()
{
typedefvector<int> vecIntContains;
vecIntContains vecInt;
vecInt.push_back( 2 );
vecInt.push_back( 7 );
vecInt.push_back( 7 );
vecInt.push_back( 5 );
vecInt.push_back( 4 );
vecInt.push_back( 1 );
vecInt.push_back( 4 );
vecInt.push_back( 1 );
vecIntContains::iterator iterEnd =unique( vecInt.begin(),vecInt.end() );//left >right
copy( vecInt.begin(),iterEnd,ostream_iterator<int>( cout,"" ) );
cout<<"\nuniquesecond operator:\n";
iterEnd = unique(vecInt.begin(),iterEnd,greater<int>() );//left > right
copy(vecInt.begin(),iterEnd,ostream_iterator<int>(cout," " ) );
system( "pause");
return0;
}
程序输出:
2 7 5 4 1 4 1
unique secondoperator:
2 7
请注意程序的第二次输出结果.