當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。