C++序列操作之std::partition
2015-08-14 10:34
489 查看
C++序列操作之std::partition
std::partition会将区间[first,last)中的元素重新排列,满足判断条件pred的元素会被放在区间的前段,不满足pred的元素会被放在区间的后段。该算法不能保证元素的初始相对位置,如果需要保证初始相对位置,应该使用stable_partition.partition源代码如下:
template<class BidirectionalIterator,class Predicate> BidirectionalIterator partition(BidirectionalIterator first,BidirectionalIterator last,Predicate pred){ while (true) { while (true) //从头开始查找满足移动条件的元素 { if (first==last) //头指针等于尾指针 return first; //直接返回 else if (pred(*first)) //头指针指向值不满足移动条件 ++first; //不移动,头指针自加 else break; //头指针指向的值满足移动条件,跳出循环 } --last; //尾指针回溯1 while (true) //从尾端查找满足移动条件的元素 { if (first==last) //头指针等于尾指针 return first; //直接返回 else if(!pred(*last)) //尾指针指向的值不满足移动条件:注意是“!” --last; //不移动,尾指针自减 else //尾指针所指元素满足移动条件: break; //跳出循环 } std::iter_swap(first,last); //将当前头尾指针所指元素进行交换 ++first; //头指针自加,进入下一轮循环 } }
示例:
bool IsOdd (int i) { //用语判断奇数 return (i%2)==1; //奇数返回true,偶数返回0 } int main(void) { std::vector<int> ivec; for (int i=1; i<10; ++i) ivec.push_back(i); // 1 2 3 4 5 6 7 8 9 auto bound = partition (ivec.begin(), ivec.end(), IsOdd); std::cout << "odd elements:"; for (auto it=ivec.begin(); it!=bound; ++it) std::cout << ' ' << *it; //输出1,9,3,7,5 std::cout << "even elements:"; for (auto it=bound; it!=ivec.end(); ++it) std::cout << ' ' << *it; //输出6,4,8,2 return 0; }
PS:未找到stable_partition源代码,貌似不对外开放.
相关文章推荐
- C语言的有符号与无符号,二进制整数的扩展与截断
- VC++ 浅谈VS2010中CMFCToolBar的用法
- VS2010 C++ 学习笔记(四) 1.数据的封装 2.类外定义 3.构造函数(无参,有参,重载,初始化列表,拷贝) 4.练习
- C++存储方案
- 【转】C语言mem.h中的函数介绍
- 【转】c语言位域操作—_结构体内冒号:的使用
- 50条大牛C++编程开发学习建议
- VC++获取病毒的消息钩子
- iOS概念入门学习-C语言-指针
- C++成员函数重载 覆盖 隐藏
- C++常见的质数判断算法
- c++ inline 的位置不当导致的 无法解析的外部符号
- C++判断两个序列的包含关系: std::includes
- VS2010,C语言编程调用函数sqrt
- C++模板学习
- 深入理解C++对象模型-对象的内存布局,vptr,vtable
- OC语言-05-OC语言-内存管理
- VC++中窄字节、宽字节的由来
- C语言文件读写例题,fgetc,fputc,fgets,fputs,fread,fwrite,fscanf,fprintf
- C语言正确使用extern关键字