64,654
社区成员
发帖
与我相关
我的任务
分享
#include <algorithm>
#include <iostream>
using namespace std;
void print(int x){
cout << x << ' ';
}
bool less10(int x){
return x < 10 ? 1 : 0;
}
int main(void){
int iArray[10]={16, -1, 3, 11, 2, 5, 8, 20, 9, 4};
int *result=partition1(iArray, iArray+10, less10);
cout << "按小于10进行分割" << endl;
for_each(iArray, iArray+10, print);
cout <<endl<<"partition算法返回的分界元素为 " << *result <<endl;
return 0;
}
PS:例子可以参加《C++ STL 开发技术导引》P334,例程22_27
template<class _BI, class _Pr> inline
_BI partition1(_BI _F, _BI _L, _Pr _P)
{for (; ; ++_F)
{for (; _F != _L && _P(*_F); ++_F)
;
if (_F == _L)
break;
for (; _F != --_L && !_P(*_L); )
;
if (_F == _L)
break;
iter_swap(_F, _L); }
return (_F); }
template <class _ForwardIter, class _Predicate>
_STLP_INLINE_LOOP _ForwardIter __partition(_ForwardIter __first,
_ForwardIter __last,
_Predicate __pred,
const forward_iterator_tag &) {
if (__first == __last) return __first;
while (__pred(*__first))
if (++__first == __last) return __first;
_ForwardIter __next = __first;
while (++__next != __last) {
if (__pred(*__next)) {
_STLP_STD::swap(*__first, *__next);
++__first;
}
}
return __first;
}
#include <algorithm>
#include <iostream>
using namespace std;
void print(int x){
cout << x << ' ';
}
bool less10(int x){
return x < 10 ? 1 : 0;
}
int main(void){
int iArray[10]={16, -1, 3, 11, 2, 5, 8, 20, 9, 4};
int *result=partition1(iArray, iArray+10, less10);
cout << "按小于10进行分割" << endl;
for_each(iArray, iArray+10, print);
cout <<endl<<"partition算法返回的分界元素为 " << *result <<endl;
const int len=sizeof(iArray)/sizeof(int);
cout<<"-----------------,查找第7个元素"<<endl;
nth_element(iArray,iArray+6,iArray+len);
for_each(iArray, iArray+10, print);
cout << endl;
return 0;
}
按小于10进行分割
4 -1 3 9 2 5 8 20 11 16
partition算法返回的分界元素为 20
-----------------,查找第7个元素
4 -1 3 5 2 8 9 11 16 20
按小于10进行分割
4 -1 3 9 2 5 8 20 11 16
partition算法返回的分界元素为 20
template <class _ForwardIter, class _Predicate>
_ForwardIter partition(_ForwardIter __first, _ForwardIter __last, _Predicate __pred) {
_STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
return _STLP_PRIV __partition(__first, __last, __pred, _STLP_ITERATOR_CATEGORY(__first, _ForwardIter));
}
按小于10进行分割
-1 3 2 5 8 9 4 20 11 16
partition算法返回的分界元素为 20
#include <algorithm>
#include <iostream>
using namespace std;
void print(int x)
{
cout << x << ' ';
}
int *mypartition(int *first,int *last,const int & p);
int main(void)
{
int iArray[10]= {16, -1, 3, 11, 2, 5, 8, 20, 9, 4};
int *result=mypartition(iArray, iArray+10, 10);
cout << "按小于10进行分割" << endl;
for_each(iArray, iArray+10, print);
cout <<endl<<"partition算法返回的分界元素为 " << *result <<endl;
return 0;
}
int *mypartition(int *first,int *last,const int &p)
{
if (first == last) return first;
while ((*first)<p)
if (++first == last) return first;
int * next = first;
while (++next != last) {
if ((*next)<p) {
std::swap(*first, *next);
++first;
}
}
return first;
}