1 2 3 4 5 6 7 8 9
在此基础上,如果设定筛选规则为 i%2=0(其中 i 即代指数组 a 中的各个元素),则借助 partition() 函数,a[9] 数组中存储数据的顺序可能变为:1 9 3 7 5 6 4 8 2
其中 {1,9,3,7,5} 为第一组,{6,4,8,2} 为第二组。显然前者中的各个元素都符合筛选条件,而后者则都不符合。由此还可看出,partition() 函数只会根据筛选条件将数据进行分组,并不关心分组后各个元素具体的存储位置。<algorithm>
头文件中,因此在使用该函数之前,程序中应先引入此头文件:
#include <algorithm>如下为 partition() 函数的语法格式:
ForwardIterator partition (ForwardIterator first, ForwardIterator last, UnaryPredicate pred);其中,first 和 last 都为正向迭代器,其组合 [first, last) 用于指定该函数的作用范围;pred 用于指定筛选规则。
#include <iostream> // std::cout #include <algorithm> // std::partition #include <vector> // std::vector using namespace std; //以普通函数的方式定义partition()函数的筛选规则 bool mycomp(int i) { return (i % 2) == 0; } //以函数对象的形式定义筛选规则 class mycomp2 { public: bool operator()(const int& i) { return (i%2 == 0); } }; int main() { std::vector<int> myvector{1,2,3,4,5,6,7,8,9}; std::vector<int>::iterator bound; //以 mycomp2 规则,对 myvector 容器中的数据进行分组 bound = std::partition(myvector.begin(), myvector.end(), mycomp2()); for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it) { cout << *it << " "; } cout << "\nbound = " << *bound; return 0; }程序执行结果为:
8 2 6 4 5 3 7 1 9
bound = 5
1 2 3 4 5 6 7 8 9
假定筛选规则为 i%2=0(其中 i 即代指数组 a 中的各个元素),则借助 stable_partition() 函数,a[9] 数组中存储数据的顺序为:2 4 6 8 1 3 5 7 9
其中 {2,4,6,8} 为一组,{1,3,5,7,9} 为另一组。通过和先前的 a[9] 对比不难看出,各个组中元素的相对位置没有发生改变。<algorithm>
头文件中,其语法格式如下:
BidirectionalIterator stable_partition (BidirectionalIterator first, BidirectionalIterator last, UnaryPredicate pred);其中,first 和 last 都为双向迭代器,其组合 [first, last) 用于指定该函数的作用范围;pred 用于指定筛选规则。
#include <iostream> // std::cout #include <algorithm> // std::stable_partition #include <vector> // std::vector using namespace std; //以普通函数的方式定义partition()函数的筛选规则 bool mycomp(int i) { return (i % 2) == 1; } //以函数对象的形式定义筛选规则 class mycomp2 { public: bool operator()(const int& i) { return (i%2 == 1); } }; int main() { std::vector<int> myvector{1,2,3,4,5,6,7,8,9}; std::vector<int>::iterator bound; //以 mycomp2 规则,对 myvector 容器中的数据进行分组 bound = std::stable_partition(myvector.begin(), myvector.end(), mycomp); for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it) { cout << *it << " "; } cout << "\nbound = " << *bound; return 0; }程序执行结果为:
1 3 5 7 9 2 4 6 8
bound = 2
本文链接:http://task.lmcjl.com/news/14011.html