C++中的std::is_partitioned
std::is_partitioned 用于查找区间 [first, last)
是否已分区。如果区间根据某个条件分成了两部分,使得所有满足该条件的元素都在不满足该条件的元素之前,则称该区间已被分区。
它定义在头文件中。如果要检查其是否已分区的区间为空,则此函数返回true。
语法:
bool is_partitioned (InputIterator first,
InputIterator last, UnaryPredicate pred);
first: 区间的第一个元素的输入迭代器。
last: 区间的最后一个元素的输入迭代器。
pred: 一元谓词,接受区间中的元素作为参数,并返回一个可转换为bool值的值。返回的值表示该元素是否属于第一组(如果为true,则该元素应在所有返回false的元素之前)。
该函数不应修改其参数。
此可以是函数指针或函数对象。
返回: 如果pred(指向迭代器的区间 [first,last)
中的所有元素,使得pred返回true的元素都在它返回false的元素之前,则返回true。否则,返回false。
如果区间为空,则该函数返回true。
// C++程序演示了std::is_partitioned的用法
#include <iostream>
#include <algorithm>
#include <vector>
// 定义二进制函数
bool pred(int a)
{
return (a % 3 == 0);
}
using namespace std;
int main()
{
// 声明第一个向量
vector<int> v1 = { 3, 6, 9, 10, 11, 13 };
// 使用std::is_partitioned
bool b = std::is_partitioned(v1.begin(), v1.end(), pred);
if (b == 1) {
cout << "它已分区了";
} else {
cout << "它没有被分区。";
}
return 0;
}
输出:
它已分区了
解释: 在本程序中,首先我们将元素存储在一个向量中,然后我们检查是否所有可被3整除的元素都在不能被3整除的元素之前。由于该条件对于采用的向量返回true,因此此处返回值为1,因为它已被分区。
另一个例子
- 检查所有奇数和偶数元素是否已分割
// C++程序演示std::is_partitioned的使用
#include<iostream>
#include<algorithm>
#include<vector>
// 定义二元函数
bool pred(int a)
{
return (a % 2 == 0);
}
using namespace std;
int main()
{
// 声明第一个向量
vector<int> v1 = { 2, 4, 6, 3, 5, 7, 9 };
// 使用std::is_partitioned
bool b = std::is_partitioned(v1.begin(), v1.end(), pred);
if (b == 1) {
cout << "所有偶数都在奇数之前。";
} else {
cout << "不是所有的偶数都在奇数之前。";
}
// 在v1的末尾插入一个偶数
// 因此,std::is_partitioned返回false
v1.push_back(16);
// 再次使用std::is_partitioned
b = std::is_partitioned(v1.begin(), v1.end(), pred);
if (b == 1) {
cout << "\n所有偶数都在奇数之前。";
} else {
cout << "\n不是所有的偶数都在奇数之前。";
}
return 0;
}
输出:
所有偶数都在奇数之前。
不是所有的偶数都在奇数之前。