C++ partition_point()函数(详解版)
事实上,有些数据本身就已经是按照某个筛选规则分好组的,例如:
类似上面这样已经“分好组”的数据,在使用时会有一个问题,即不知道两组数据之间的分界在什么位置。有读者可能想到,再调用一次 partition()、stale_partition() 或者 partition_copy() 不就可以了吗?这种方法确实可行,但对已经分好组的数据再进行一次分组,是没有任何必要的。1,2,3,4,5,6,7 <-- 根据规则 i<4,{1,2,3} 为一组,{4,5,6,7} 为另一组
2,4,6,8,1,3,5,7,9 <-- 根据规则 i%2=0,{2,4,6,8} 为一组,{1,3,5,7,9} 为另一组
实际上,对于如何在已分好组的数据中找到分界位置,C++ 11标准库提供了专门解决此问题的函数,即 partition_point() 函数。
partition_point() 函数定义在
<algorithm>头文件中,其语法格式为:其中,first 和 last 为正向迭代器,[first, last) 用于指定该函数的作用范围;pred 用于指定数据的筛选规则。ForwardIterator partition_point (ForwardIterator first, ForwardIterator last,
UnaryPredicate pred);
同时,该函数会返回一个正向迭代器,该迭代器指向的是 [first, last] 范围内个不符 pred 筛选规则的元素。所谓筛选规则,其实就是包含 1 个参数且返回值类型为 bool 的函数,此函数可以是一个普通函数,也可以是一个函数对象。
举个例子:
#include <iostream> // std::cout
#include <algorithm> // std::partition_point
#include <vector> // std::vector
using namespace std;
//以普通函数的方式定义筛选规则
bool mycomp(int i) { return (i % 2) == 0; }
//以函数对象的形式定义筛选规则
class mycomp2 {
public:
bool operator()(const int& i) {
return (i % 2 == 0);
}
};
int main() {
vector<int> myvector{ 2,4,6,8,1,3,5,7,9 };
//根据 mycomp 规则,为 myvector 容器中的数据找出分界
vector<int>::iterator iter = partition_point(myvector.begin(), myvector.end(),mycomp);
//输出组的数据
for (auto it = myvector.begin(); it != iter; ++it) {
cout << *it << " ";
}
cout << "\n";
//输出第二组的数据
for (auto it = iter; it != myvector.end(); ++it) {
cout << *it << " ";
}
cout << "\n*iter = " << *iter;
return 0;
}
程序执行结果为:
2 4 6 8
1 3 5 7 9
*iter = 1
通过分析程序并结输出结果可以看到,partition_point() 返回了一个指向元素 1 的迭代器,而该元素为 myvector 容器中个不符 mycomp 规则的元素,同时其也可以第二组数据中个元素。值得一提的是,C++ 11标准库中给出了 partition_point() 函数底层实现的参考代码(如下所示),感兴趣的读者可自行分析,这里不再进行赘述:
template <class ForwardIterator, class UnaryPredicate>
ForwardIterator partition_point (ForwardIterator first, ForwardIterator last,
UnaryPredicate pred)
{
auto n = distance(first,last);
while (n>0)
{
ForwardIterator it = first;
auto step = n/2;
std::advance (it,step);
if (pred(*it)) { first=++it; n-=step+1; }
else n=step;
}
return first;
}
- 随机文章
- 中国 马尔代夫 回放(中马亲密伙伴:习近平访马纳斯航空基地回放)
- 中国 马尔代夫 桥梁(中国和马尔代夫将共建海底高速光缆通信网络)
- 中国 对 马尔代夫(中马关系:中国助力马尔代夫成为发展中的岛屿旅游胜地)
- 马尔代夫风景配乐(美妙马尔代夫:天堂景色与动人旋律)
- 魅力马尔代夫壁纸(惊艳马尔代夫:美不胜收的壁纸桌面)
- 去马尔代夫转机吗(马尔代夫作为中转站,能否方便转机?)
- 马尔代夫首都概况(探索马尔代夫首都的文化和历史特色)
- 去香港去马尔代夫(从香港到马尔代夫,探访极致海岛风光)
- 宽幅马尔代夫壁纸(高清马尔代夫风景壁纸,让你身临其境)
- 宿迁马尔代夫小岛(宿迁市民拥有全球的马尔代夫私人小岛)
- 亚洲马尔代夫旅行(探秘亚洲最美海滩:马尔代夫旅行指南)
- 如何走在马尔代夫(马尔代夫旅游攻略:如何体验热带天堂)
- 八月 马尔代夫(马尔代夫旅游季节:八月小清新)
- 日本污染马尔代夫(日本污染对马尔代夫环境影响长期存在)
- 航拍 马尔代夫(用无人机拍摄的马尔代夫风光)
- 卡尼 马尔代夫(卡尼成为马尔代夫新总统)
- 云和马尔代夫违章(马尔代夫旅游涉违章,云和被责令整改)
- 快艇 马尔代夫(快艇探寻马尔代夫风光)
- 浏阳马尔代夫现状(浏阳马尔代夫:旅游业重振,恢复极佳)
- 晚安 马尔代夫(马尔代夫之夜:道晚安)
- 汉语中心马尔代夫(中央马尔代夫,世外桃源般的度假胜地)
- 女足 马尔代夫(马尔代夫女足:海滨足球场上的挑战)
- 福建马尔代夫住宿(福建游客马尔代夫五星度假屋体验分享)
- 莱州冬季马尔代夫(莱州推出冬季版“马尔代夫”旅游路线)
- 温州马尔代夫房价(温州投资者赴马尔代夫购房,房价飙升)
- 西北马尔代夫风景(探秘西北马尔代夫风光,惊叹自然美景)
- 色彩颜料马尔代夫(探索马尔代夫:颜色与文化的奇妙交织)
- 宜昌 马尔代夫(宜昌游客可免签前往马尔代夫,享受海岛度假)
- 虎鲨海豚马尔代夫(马尔代夫海洋世界现身罕见虎鲨海豚!)
- 牟平马尔代夫规划(规划出炉!牟平打造马尔代夫风情小镇)
