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++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。