is_partitioned
头文件 'is_partitioned.hpp' 包含is_partitioned 算法的的两个变种. 该算法测试一个序列T是否按照某个谓词来划分的;换句话说满足该为此的元素都在序列的开头。
is_partitioned 有两种调用格式:第一种是带一对迭代器,用来表示参数范围。第二种形式带一个范围的参数,这些参数被Boost.Range便利过。
官方API
template<typename InputIterator, typename Predicate> bool is_partitioned ( InputIterator first, InputIterator last, Predicate p ); template<typename Range, typename Predicate> bool is_partitioned ( const Range &r, Predicate p );
#include <boost/algorithm/cxx11/is_partitioned.hpp> #include <iostream> #include <vector> using namespace boost::algorithm; bool isOdd(int i){ return i % 2 == 1;} bool lessThan10(int i){ return i < 10;} int main() { std::vector<int > c; c.push_back(0); c.push_back(1); c.push_back(2); c.push_back(3); c.push_back(14); c.push_back(15); //false 并不是按照谓词(偶数)划分的。要返回true应该是偶数在前,奇数在后 std::cout<<is_partitioned ( c, isOdd ) <<std::endl; //true 小于10的在前,大于的在后,因此返回true std::cout<<is_partitioned ( c, lessThan10 ) <<std::endl; //true std::cout<<is_partitioned ( c.begin (), c.end (), lessThan10 ) <<std::endl; //true std::cout<<is_partitioned ( c.begin (), c.begin () + 3, lessThan10 ) <<std::endl; //true 特例,为空的序列一律返回true std::cout<<is_partitioned ( c.end (), c.end (), isOdd ) <<std::endl; return 0; }
不能作用于output迭代器!其他迭代器都行。
时间复杂度
O(N)。两个函数会比较序列中的每一个元素,当发现任一个元素不符合谓词划分要求时候,立即返回,余下的元素不会被测试到。
异常安全
两个函数都是通过传值或者通过常引用传参数。不要依赖任何全局变量的行为。因此,两个函数都提供了强异常安全保证。
注意
The iterator-based version of the routine is_partitioned is part of the C++11 standard. When compiled using a C++11 implementation, the implementation from the standard library will be used.
对于空的参数序列,一律返回true。