partition
、partition_point
、stable_partition
和 partition_copy
都是用于分割序列的算法,但它们在行为和用途上有一些重要的区别。
partition
功能:将序列重新排列,使得满足指定谓词的元素排在前面,不满足的排在后面。不能保证保持原有元素的相对顺序。
返回值:指向第一个不满足谓词的元素的迭代器。
用法:
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto it = std::partition(vec.begin(), vec.end(), [](int x) { return x % 2 == 0; });
std::cout << "Partitioned vector: ";
for (int v : vec) {
std::cout << v << " ";
}
std::cout << std::endl;
std::cout << "Partition point: " << *it << std::endl;
return 0;
}
输出:
Partitioned vector: 10 2 8 4 6 5 7 3 9 1
Partition point: 5
partition_point
功能:在已经按某个谓词分割的序列中,找到第一个不满足该谓词的元素的位置。假设输入范围已经是分割好的。
返回值:指向第一个不满足谓词的元素的迭代器。
用法:
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {2, 4, 6, 8, 1, 3, 5, 7, 9};
auto it = std::partition_point(vec.begin(), vec.end(), [](int x) { return x % 2 == 0; });
std::cout << "Partitioned vector: ";
for (int v : vec) {
std::cout << v << " ";
}
std::cout << std::endl;
std::cout << "Partition point: " << *it << std::endl;
return 0;
}
输出:
Partitioned vector: 2 4 6 8 1 3 5 7 9
Partition point: 1
stable_partition
功能:将序列重新排列,使得满足指定谓词的元素排在前面,不满足的排在后面,并且保持相对顺序不变。
返回值:指向第一个不满足谓词的元素的迭代器。
用法:
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto it = std::stable_partition(vec.begin(), vec.end(), [](int x) { return x % 2 == 0; });
std::cout << "Stable partitioned vector: ";
for (int v : vec) {
std::cout << v << " ";
}
std::cout << std::endl;
std::cout << "Partition point: " << *it << std::endl;
return 0;
}
输出:
Stable partitioned vector: 2 4 6 8 10 1 3 5 7 9
Partition point: 1
partition_copy
功能:将序列中的元素按谓词分为两部分,分别复制到两个不同的输出序列中。
返回值:包含两个迭代器的pair,分别指向两个输出序列的末尾。
用法:
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> even, odd;
even.resize(vec.size());
odd.resize(vec.size());
auto it = std::partition_copy(vec.begin(), vec.end(), even.begin(), odd.begin(), [](int x) { return x % 2 == 0; });
even.resize(std::distance(even.begin(), it.first)); // 调整大小
odd.resize(std::distance(odd.begin(), it.second)); // 调整大小
std::cout << "Even numbers: ";
for (int v : even) {
std::cout << v << " ";
}
std::cout << std::endl;
std::cout << "Odd numbers: ";
for (int v : odd) {
std::cout << v << " ";
}
std::cout << std::endl;
return 0;
}
输出:
Even numbers: 2 4 6 8 10
Odd numbers: 1 3 5 7 9
总结
partition
:
功能:重新排列序列,使满足谓词的元素在前,不满足的在后。
特点:不保证相对顺序。
partition_point
:
功能:在已按谓词分割好的序列中,找到第一个不满足谓词的元素的位置。
特点:假设输入已分割好。
stable_partition
:
功能:重新排列序列,使满足谓词的元素在前,不满足的在后。
特点:保持相对顺序。
partition_copy:
功能:将满足和不满足谓词的元素分别复制到两个不同的输出序列中。
特点:不改变输入序列。