在 STL 中 partition_copy() 和 stable_partition() 一样也能按照某个筛选规则对指定区域内的数据进行 “分组”,并且分组后不会改变各个元素的相对位置。
更重要的是,partition_copy() 函数不会对原序列做修改,而是以复制的方式将序列中各个元组 “分组” 到其它的指定位置存储。
#include <algorithm>
语法
pair<OutputIterator1,OutputIterator2> partition_copy ( InputIterator first, InputIterator last, OutputIterator1 result_true, OutputIterator2 result_false, UnaryPredicate pred);
参数
参数 描述 first 输入迭代器 last 输入迭代器 result_true 输出迭代器,其用于指定某个存储区域,以存储满足筛选条件的数据 result_false 输出迭代器,其用于指定某个存储区域,以存储满足筛选条件的数据 pred 用于指定筛选规则,其本质就是接收一个具有 1 个参数且返回值类型为 bool 的函数。注意,该函数既可以是普通函数,还可以是一个函数对象。 说明
first、last:都为输入迭代器,其组合 [first, last) 用于指定该函数处理的数据区域;
result_true:为输出迭代器,其用于指定某个存储区域,以存储满足筛选条件的数据;
result_false:为输出迭代器,其用于指定某个存储区域,以存储满足筛选条件的数据;
pred:用于指定筛选规则,其本质就是接收一个具有 1 个参数且返回值类型为 bool 的函数。注意,该函数既可以是普通函数,还可以是一个函数对象。
技术细节
该函数还会返回一个 pair 类型值,其包含 2 个迭代器,第一个迭代器指向的是 result_true 区域内最后一个元素之后的位置;第二个迭代器指向的是 result_false 区域内最后一个元素之后的位置。
案例
STL partition_copy函数
使用 STL partition_copy 函数筛选集合
#include <iostream> #include <algorithm> #include <vector> using namespace std; bool mycomp(int i) { return (i % 2) == 0; } int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; std::vector<int> myvector{1, 2, 3, 4, 5, 6, 7, 8, 9}; int b[10] = {0}, c[10] = {0}; pair<int*, int*> result= partition_copy(myvector.begin(), myvector.end(), b, c, mycomp); cout << "b[10]:"; for (int *p = b; p < result.first; p++) { cout << *p << " "; } cout << "\nc[10]:"; for (int *p = c; p < result.second; p++) { cout << *p << " "; } cout << endl; return 0; }
我们在 Linux 下使用 g++ 进行编译,具体命令如下:
g++ partition_copy.cpp -std=c++11
编译后,我们直接运行生成的二进制文件
a.out
,如下图所示:我们使用了数组来存储 partition_copy() 函数分组后的数据,当然也可以用容器来存储。
STL partition_copy函数总结
在 STL 中 partition_copy() 和 stable_partition() 一样也能按照某个筛选规则对指定区域内的数据进行 “分组”,并且分组后不会改变各个元素的相对位置。
更重要的是,partition_copy() 函数不会对原序列做修改,而是以复制的方式将序列中各个元组 “分组” 到其它的指定位置存储。