📜  C++ STL中的std :: partition(1)

📅  最后修改于: 2023-12-03 15:13:56.729000             🧑  作者: Mango

C++ STL中的std::partition

在C++ STL中,partition是一个用于分割元素序列的算法。它可以将一个序列分成两个部分,第一部分满足某个条件,第二部分不满足该条件。该算法定义在头文件中,其函数原型为:

template<class ForwardIt, class UnaryPredicate>
ForwardIt partition(ForwardIt first, ForwardIt last, UnaryPredicate p);

其中,first和last是迭代器,表示待分割的序列的起始和结束位置;p是一个一元谓词,表示分割标准。返回值为一个迭代器,指向分割后第二部分的第一个元素。

以下是一个简单的例子,使用partition函数将一个数列分成奇数和偶数两部分:

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    auto it = std::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 << '\n';
    std::cout << "Even elements:";
    for (auto i = it; i != v.end(); ++i) {
        std::cout << ' ' << *i;
    }
    std::cout << '\n';
    return 0;
}

输出结果为:

Odd elements: 1 3 5 7 9
Even elements: 2 4 6 8

可以看到,程序通过lambda表达式定义的一元谓词来分割数列,返回的迭代器it指向第一个偶数。

需要注意的是,分割后并不保证两部分的元素是有序的,它们的相对位置可能会改变。

另外,由于partition不会保证分割后两部分的相对顺序,其在某些情况下可能会带来不必要的负面影响。如果需要保持原有顺序,可以使用stable_partition算法。

以上就是关于C++ STL中的std::partition的介绍。