Boost 学习之算法篇 is_partitioned

is_partitioned

头文件 'is_partitioned.hpp' 包含is_partitioned 算法的的两个变种. 该算法测试一个序列T是否按照某个谓词来划分的;换句话说满足该为此的元素都在序列的开头。

常用的is_partitioned 函数带有一个参数序列和一个谓词参数.假如序列按照谓词划分则返回true。

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。



你可能感兴趣的:(C++,boost)