unique详解

41 篇文章 0 订阅
39 篇文章 2 订阅

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

请注意程序的第二次输出结果.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值