当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ partition_point用法及代码示例


partition_point() 获取分区点:返回一个迭代器,指向分区范围 [first, last) 中 pred(predicate) 不为 true 的第一个元素,指示其分区点。

范围中的元素应该已经被分区,就像用相同的参数调用分区一样。

该函数通过比较排序范围的非连续元素来优化执行的比较次数,这对于随机访问迭代器特别有效。

用法:

  ForwardIterator partition_point(ForwardIterator first, 
                                  ForwardIterator last,
                                  UnaryPredicate pred); 

Parameters :
first, last :
将迭代器转发到分区序列的初始位置和最终位置。检查的范围是[first,last),包含first和last之间的所有元素,包括first指向的元素但不包括last指向的元素。

pred
一元函数,接受范围内的元素作为参数,并返回可转换为 bool 的值。返回的值指示元素是否位于分区点之前(如果为 true,则位于分区点之前;如果为 false,则位于分区点之前或之后)。该函数不得修改其参数。这可以是函数指针或函数对象。

返回值:
指向分区范围 [first, last) 中 pred 不为 true 的第一个元素的迭代器,如果任何元素都不为 true,则指向 last 元素。

该函数模板的定义等价于:

template 
  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;
}

示例 1:


// C++ program to get odd elements 
// and even elements 
#include <iostream> // std::cout 
#include <algorithm> // std::partition, std::partition_point 
#include <vector> // std::vector 
  
bool IsOdd(int i) { return (i % 2) == 1; } 
  
int main() 
{ 
    std::vector<int> data{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    std::vector<int> odd, even; 
  
    // partition data on the basis of odd elements  
    // using pred IsOdd() 
    std::stable_partition(data.begin(), data.end(), IsOdd); 
  
    // gets the partition point based on odd elements 
    auto it = std::partition_point(data.begin(), data.end(),  
                                                     IsOdd); 
  
    // assign elements to odd from beginning till partition  
    // point. 
    odd.assign(data.begin(), it); 
    even.assign(it, data.end()); 
  
    // print contents of odd: 
    std::cout << "odd:"; 
    for (int& x : odd) 
        std::cout << ' ' << x; 
    std::cout << '\n'; 
  
    // print contents of even: 
    std::cout << "even:"; 
    for (int& x : even) 
        std::cout << ' ' << x; 
    std::cout << '\n'; 
  
    return 0; 
} 

输出:

odd:  1 3 5 7 9
even: 2 4 6 8 10

示例 2:


// C++ program to get negative elements 
// and positive elements using partition_point 
#include <iostream> // std::cout 
#include <algorithm> // std::partition, std::partition_point 
#include <vector> // std::vector 
  
bool IsNegative(int i) { return (i < 0); } 
  
int main() 
{ 
    std::vector<int> data{ 1, -1, 3, -4, 5, 2, -2, 4,  
                                             -5, -3 }; 
    std::vector<int> negative, positive; 
  
    // partition data on the basis of odd elements using  
    // pred IsNegative() 
    std::stable_partition(data.begin(), data.end(),  
                                       IsNegative); 
  
    // gets the partition point based on odd elements 
    auto it = std::partition_point(data.begin(), data.end(),  
                                                 IsNegative); 
  
    // assign elements to odd from beginning till 
    // partition point. 
    negative.assign(data.begin(), it); 
    positive.assign(it, data.end()); 
  
    // print contents of odd: 
    std::cout << "Negative: "; 
    for (int& x : negative) 
        std::cout << ' ' << x; 
    std::cout << '\n'; 
  
    // print contents of even: 
    std::cout << "Positive: "; 
    for (int& x : positive) 
        std::cout << ' ' << x; 
    std::cout << '\n'; 
  
    return 0; 
} 

输出:

Negative:  -1 -4 -2 -5 -3
Positive:  1 3 5 2 4

复杂:
执行大约 log2(N)+2 个元素比较(其中 N 是该距离)。在非随机访问迭代器上,迭代器的进步平均会产生 N 的额外线性复杂度。



相关用法


注:本文由纯净天空筛选整理自佚名大神的英文原创作品 partition_point in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。