Boost 学习之算法篇 partition_point

partition_point

       头文件 'partition_point.hpp'包含单个算法partition_point的两种变体。假设给出一个划分好的序列以及一个谓词,该算法将找出序列中划分的位置;比如说,找出序列中的第一不满足谓词的元素 。(注释:比如说我们给一个序列0,6,7,3,14,15,谓词是10,那么该函数返回的第一个位置是元素14的位置;所谓的“划分好的序列”,我的理解是:按照与某个值比较为标准,符合该标准的在一边,不符合的在另一边。比如说一个int数组,以是否大于10 位标准,大于10的在前面,然后10在中间,后面的是小于10。)

       原文链接:http://www.boost.org/doc/libs/1_60_0/libs/algorithm/doc/html/the_boost_algorithm_library/CXX11/partition_point.html

       常用的partition_point函数带一个划分号的序列以及一个谓词 。该函数将返回一个指向序列号中第一个不符合谓词的元素位置的迭代器。假如序列中的所有元素皆满足谓词,则返回指向序列最后一个元素的下一位置位置的迭代器(想想end())。

       partition_point 函数有两种调用格式。第一种格式带一对迭代器来表示序列范围;第二种格式带使用Boost.Range表示的区间参数 。(恕我总是没办法精确翻译好这句话,包括之前的几篇博客中 The second form takes a single range parameter, and uses Boost.Range to traverse it.哪一天我再改改我的博客吧。)

       官方API

template<typename ForwardIterator, typename Predicate>
	ForwardIterator partition_point ( ForwardIterator first, ForwardIterator last, Predicate p );
template<typename Range, typename Predicate>
	boost::range_iterator<Range> partition_point ( const Range &r, Predicate p );

       官方例子
       给出一个容器 C { 0, 1, 2, 3, 14, 15 },然后

bool lessThan10 ( int i ) { return i < 10; }
bool isOdd ( int i ) { return i % 2 == 1; }

partition_point ( c, lessThan10 ) //返回的迭代器指向c.begin () + 4 位置 (即指向元素 14所在位置)
partition_point ( c.begin (), c.end (), lessThan10 ) //返回的迭代器指向 c.begin () + 4 位置 (即指向元素 14所在位置)
partition_point ( c.begin (), c.begin () + 3, lessThan10 ) // 返回的迭代器指向 c.begin () + 3 位置,(即指向end)
partition_point ( c.end (), c.end (), isOdd ) --> c.end ()  //返回的迭代器指向 end 

迭代器要求
        partition_point需要前置迭代器或者双向迭代器( or better), 不能作用于输入输出迭代器上。(一句话是partition_point requires forward iterators or better;这句话的or better我觉得应该指的是双向的迭代器—or bidirectional iterators is much better)。
        partition_point的两个变体的时间复杂度都是 O( log (N)) (logarithmic);也就是说,谓词将会很好的与序列中的元素比较log(N)次。然而,为了做到这个要求,算法需要知道序列的长度。前置迭代器以及双向迭代器将会用一个时间复杂度为O(N)的操作来计算序列的长度。

异常安全
       partition_point的两个变体都通过传值或者传常引用来传递参数,不依赖任何全局状态。因此,他们都提供了很强的异常安全性。

注意

      The iterator-based version of the routine partition_point is part of the C++11 standard. When compiled using a C++11 implementation, the implementation from the standard library will be used.
       对于空范围序列来说,返回的划分位置是序列的最后一个位置(就是endl()位置)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值