partition/stable_partition详解
来源:互联网 发布:苹果手机视频软件 编辑:程序博客网 时间:2024/06/06 16:25
Partition:将满足条件的元素向前移动.
// TEMPLATE FUNCTION partition
template<class _BidIt,
class _Pr> inline
_BidIt _Partition(_BidIt _First, _BidIt _Last, _Pr _Pred)
{ // move elements satisfying _Pred to beginning of sequence
for (; ; ++_First)//最外层循环是一次往后面找元素
{ // find any out-of-order pair
for (; _First != _Last && _Pred(*_First); ++_First)//找到使得_Pred为false的元素
; // skip in-place elements at beginning
if (_First == _Last)
break; // done
for (; _First != --_Last && !_Pred(*_Last); )//找到是的_Pred为true的元素.
; // skip in-place elements at end
if (_First == _Last)
break; // done
_STD iter_swap(_First, _Last); // swap out-of-place pair and loop
//经过两个内循环的查找,前者是的_Pred为false,后者使得_Pred为true的元素已经找到,并交换彼此
}
return (_First);
}
需要注意的一点:vs2010的stl实现方式中,很喜欢使用if( -- iter )/for(_First != --_Last)这类的表达式,这类表达式的有点是代码量少,程序整洁,但是缺点就是容易造成语义判断错误,比如--iter中,即使if判断失败iter也减一操作.
Stable_partition:将满足条件的元素向前移动.(但不改变初始状态的相对顺序)
// TEMPLATE FUNCTION stable_partition
template<class _BidIt,
class _Pr,
class _Diff,
class _Ty> inline
_BidIt _Stable_partition(_BidIt _First, _BidIt _Last, _Pr _Pred,
_Diff _Count, _Temp_iterator<_Ty>& _Tempbuf)
{ // partition preserving order of equivalents, using _Pred
if (_Count == 0)
return (_First);
else if (_Count == 1)
return (_Pred(*_First) ? _Last : _First);
else if (_Count <= _Tempbuf._Maxlen())
{ // temp buffer big enough, copy right partition out and back
_BidIt _Next = _First;
for (_Tempbuf._Init(); _First != _Last; ++_First)
if (_Pred(*_First))
*_Next++ = _Move(*_First);
else
*_Tempbuf++ = _Move(*_First);
_Move(_Tempbuf._First(), _Tempbuf._Last(), _Next); // copy back
return (_Next);
}
else
{ // temp buffer not big enough, divide and conquer
_BidIt _Mid = _First;
_STD advance(_Mid, _Count / 2);
_BidIt _Left = _Stable_partition(_First, _Mid, _Pred,
_Count / 2, _Tempbuf); // form L1R1 in left half
_BidIt _Right = _Stable_partition(_Mid, _Last, _Pred,
_Count - _Count / 2, _Tempbuf); // form L2R2 in right half
_Diff _Count1 = 0;
_Distance(_Left, _Mid, _Count1);
_Diff _Count2 = 0;
_Distance(_Mid, _Right, _Count2);
return (_Buffered_rotate(_Left, _Mid, _Right,
_Count1, _Count2, _Tempbuf)); // rotate L1R1L2R2 to L1L2R1R2
}
}
这里涉及到另外一个类:_Temp_iterator,有涉及到_Move这个函数.
_Move没有看懂.想看看源码剖析,结果发现里面并没有找到这个函数的实现方式.再一次对源码剖析感到失望.
_Temp_iterator这个类不知道实际功能是做什么.
暂时就过这个函数.
举例:
int main()
{
vector<int> vecInt;
for ( int i = 1;i <= 9;++ i )
{
vecInt.push_back( i );
}
partition( vecInt.begin(),vecInt.end(),bind2nd( modulus<int>(),2 ) );
copy( vecInt.begin(),vecInt.end(),ostream_iterator<int>( cout," " ) );
cout<<"\nstable_partition:\n";
stable_partition( vecInt.begin(),vecInt.end(),bind2nd( modulus<int>(),2 ) );
copy( vecInt.begin(),vecInt.end(),ostream_iterator<int>( cout," " ) );
system( "pause" );
return 0;
}
- partition/stable_partition详解
- partition,stable_partition,sort,stable_sort
- STL之partition和stable_partition
- "partition"和“stable_partition”的思考
- STL之partition和stable_partition
- 变异算法之划分(partition, stable_partition)
- stable_partition
- stable_partition
- stable_partition
- 泛型算法系列30:stable_partition()&&partition()&&stable_sort()
- algorithm库介绍之---- partition()方法和 stable_partition()方法
- STL_算法_重排和分区(random_shuffle、partition、stable_partition)
- 理解你的排序操作(stable_sort,sort,partial_sort,nth_element,stable_partition,partition)
- stable_partition用法
- hive中Partition详解
- 详解Oracle partition分区表
- 详解Oracle partition分区表
- hive中Partition详解
- 程序人生--一个程序员对学弟学妹建议
- random_shuffle
- PHP5学习笔记-变量
- 分享8年开发经验,浅谈个人发展经历,明确自己发展方向
- SAP破解 Maintenance Certificate
- partition/stable_partition详解
- 【Coding】程序员每天该做的事 ,收藏着
- 极大似然估计的朴素理解
- 设计模式随笔系列:开篇-模式和原则
- 时间表-感悟
- [unix系统编程]读者-写者问题
- 关于class与struct的联系学习与总结
- 关于线程的问题
- RGBA格式图像中HSBC(色相、饱和度、明度、对比度)调整