📜  C++中的std :: stable_partition(1)

📅  最后修改于: 2023-12-03 14:59:50.822000             🧑  作者: Mango

C++中的std :: stable_partition

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是一种强大的算法,可用于对给定范围中的元素进行稳定的划分。