📅  最后修改于: 2023-12-03 14:59:50.822000             🧑  作者: Mango
C++中的std :: stable_partition是一种算法,用于对给定范围中的元素进行划分,不能更改元素的相对顺序,并返回指向第一个“false”元素的迭代器。
这个算法有两个版本:
template< class BidirectionalIt, class UnaryPredicate >
BidirectionalIt stable_partition( BidirectionalIt first, BidirectionalIt last, UnaryPredicate p );
template< class BidirectionalIt, class UnaryPredicate >
BidirectionalIt stable_partition( BidirectionalIt first, BidirectionalIt last, UnaryPredicate p, typename std::iterator_traits<BidirectionalIt>::value_type* buffer );
第一个版本简单地将输入范围分成两个不相交的部分,第一个部分包含所有使谓词为true的元素,第二个部分包含其他元素。分区的顺序与给定范围中的元素的相对顺序相同,因此称为“稳定”,并返回第一个“false”元素的迭代器。
以下是示例代码:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v = {1, 2, 3, 4, 5, 6};
auto it = std::stable_partition(v.begin(), v.end(), [](int i){ return i % 2 == 0; });
std::cout << "Odd elements:";
for(auto i=v.begin(); i!=it; ++i) {
std::cout << ' ' << *i;
}
std::cout << "\nEven elements:";
for(auto i=it; i!=v.end(); ++i) {
std::cout << ' ' << *i;
}
std::cout << '\n';
}
其输出结果为:
Odd elements: 1 3 5
Even elements: 2 4 6
第二个版本是用于在给定范围中进行原地操作的稳定划分。它需要一个缓冲区,将其指向范围的末尾,在确保缓冲区足够大的情况下,将其放置在堆栈或调用者分配的存储器中。此版本只应在不使用迭代器的算法(例如,稳定排序)时使用。
以下是示例代码:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v = {1, 2, 3, 4, 5, 6};
std::vector<int> buffer(v.size());
auto it = std::stable_partition(v.begin(), v.end(), [](int i){ return i % 2 == 0; }, buffer.data());
std::cout << "Odd elements:";
for(auto i=v.begin(); i!=it; ++i) {
std::cout << ' ' << *i;
}
std::cout << "\nEven elements:";
for(auto i=it; i!=v.end(); ++i) {
std::cout << ' ' << *i;
}
std::cout << '\n';
}
其输出结果与第一个版本的代码相同。
总之,std :: stable_partition是一种强大的算法,可用于对给定范围中的元素进行稳定的划分。