std::partition
是 C++ 标准库中的一个算法,它用于对容器中的元素进行重新排序,使得满足某个谓词的元素都位于不满足该谓词的元素之前。这个算法并不保证元素的相对顺序,只是简单地将它们分成两部分。
谓词(Predicate):一个返回布尔值的函数或者函数对象,用于判断元素是否满足某个条件。
std::partition:接受一个范围(起始迭代器和结束迭代器)和一个谓词,然后重新排列范围内的元素,使得满足谓词的元素都位于不满足谓词的元素之前。
std::partition
通常比完全排序要快,因为它只关心元素是否满足谓词,而不关心它们的具体顺序。operator()
的类对象。std::partition
时直接定义。假设我们有一个整数向量,我们想要将所有的偶数放在前面,所有的奇数放在后面:
#include <iostream>
#include <vector>
#include <algorithm>
bool is_even(int i) {
return i % 2 == 0;
}
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// 使用 std::partition 分隔偶数和奇数
auto partition_point = std::partition(numbers.begin(), numbers.end(), is_even);
// 输出结果
std::cout << "Even numbers: ";
for (auto it = numbers.begin(); it != partition_point; ++it) {
std::cout << *it << ' ';
}
std::cout << "\nOdd numbers: ";
for (auto it = partition_point; it != numbers.end(); ++it) {
std::cout << *it << ' ';
}
return 0;
}
问题:std::partition
后元素的相对顺序发生了变化,这在某些情况下可能不是期望的结果。
原因:std::partition
的设计就是为了快速分隔元素,而不是保持它们的相对顺序。
解决方法:如果需要保持元素的相对顺序,可以使用 std::stable_partition
,它会保持等价元素的相对顺序。
#include <iostream>
#include <vector>
#include <algorithm>
bool is_even(int i) {
return i % 2 == 0;
}
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// 使用 std::stable_partition 分隔偶数和奇数,保持相对顺序
auto partition_point = std::stable_partition(numbers.begin(), numbers.end(), is_even);
// 输出结果
for (const auto& num : numbers) {
std::cout << num << ' ';
}
return 0;
}
在这个例子中,std::stable_partition
会保证所有的偶数仍然按照它们原来的顺序排列在前面,所有的奇数也按照原来的顺序排列在后面。
领取专属 10元无门槛券
手把手带您无忧上云