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 的額外線性複雜度。
相關用法
- C++ pow()用法及代碼示例
- C++ printf()用法及代碼示例
- C++ putc()用法及代碼示例
- C++ putchar()用法及代碼示例
- C++ puts()用法及代碼示例
- C++ perror()用法及代碼示例
- C++ putwchar()用法及代碼示例
- C++ putwc()用法及代碼示例
- C++ priority_queue push()用法及代碼示例
- C++ priority_queue pop()用法及代碼示例
- C++ priority_queue empty()用法及代碼示例
- C++ priority_queue size()用法及代碼示例
- C++ priority_queue swap()用法及代碼示例
- C++ priority_queue top()用法及代碼示例
- C++ priority_queue emplace()用法及代碼示例
- C++ priority_queue::swap()用法及代碼示例
- C++ priority_queue::top()用法及代碼示例
- C++ priority_queue::empty()、priority_queue::size()用法及代碼示例
- C++ priority_queue::push()、priority_queue::pop()用法及代碼示例
- C++ priority_queue value_type用法及代碼示例
- C++ cos()用法及代碼示例
- C++ sin()用法及代碼示例
- C++ asin()用法及代碼示例
- C++ atan()用法及代碼示例
- C++ atan2()用法及代碼示例
注:本文由純淨天空篩選整理自佚名大神的英文原創作品 partition_point in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。