1. 程式人生 > 實用技巧 >C++ partition(STL partition)演算法使用

C++ partition(STL partition)演算法使用

partition演算法作用為對指定範圍內元素重新排序,使用輸入的函式,把結果為true的元素放在結果為false的元素之前

stable_partition演算法:與partition類似,不過不保證保留容器中的相對順序

C++ partition()函式

partition() 和stable_partition函式定義於<algorithm>標頭檔案中,因此需要引入標頭檔案#include <algorithm>

格式:

ForwardIterator partition (ForwardIterator first,
                           ForwardIterator last,
                           UnaryPredicate pred);

其中,first 和 last 為正向迭代器,其組合 [first, last) 用於指定該函式的作用範圍;pred 用於指定篩選規則。(篩選規則,其本質就是一個可接收 1 個引數且返回值型別為 bool 的函式,可以是普通函式,也可以是一個函式物件。)

同時,partition() 函式還會返回一個正向迭代器,其指向的是兩部分資料的分界位置,更確切地說,指向的是第二組資料中的第 1 個元素。

#include <iostream>     
#include <algorithm>   
#include <vector>       
using namespace
std; //以普通函式的方式定義partition()函式的篩選規則 bool cmp(int i) { return (i % 2) == 0; } //以函式物件的形式定義篩選規則 class cmp2{ public: bool operator()(const int& i) { return (i%2 == 0); } }; int main() { vector<int> myvector; for(int i=1;i<10;i++){ myvector.push_back(i); } vector
<int>::iterator bound; //以 mycomp2 規則,對 myvector 容器中的資料進行分組 bound = std::partition(myvector.begin(), myvector.end(), cmp2()); for (vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it) { cout << *it << " "; } cout << "\nbound = " << *bound; return 0; }

執行結果:

C++ stable_partition()函式

partition() 函式只負責對指定區域內的資料進行分組,並不保證各組中元素的相對位置不發生改變。而如果想在分組的同時保證不改變各組中元素的相對位置,可以使用stable_partition()函式。

stable_partition() 函式可以保證對指定區域內資料完成分組的同時,不改變各組內元素的相對位置。

格式:

BidirectionalIterator stable_partition (BidirectionalIterator first,
                                        BidirectionalIterator last,
                                        UnaryPredicate pred);

舉例:

#include <iostream>     
#include <algorithm>   
#include <vector>       
using namespace std;
//以普通函式的方式定義partition()函式的篩選規則
bool cmp(int i) { return (i % 2) == 0; }
//以函式物件的形式定義篩選規則
class cmp2{
public:
    bool operator()(const int& i) {
        return (i%2 == 0);
    }
};
int main() {
    vector<int> myvector;
    for(int i=1;i<10;i++){
        myvector.push_back(i);
    }
    vector<int>::iterator bound;
    //以 mycomp2 規則,對 myvector 容器中的資料進行分組
    bound = std::stable_partition(myvector.begin(), myvector.end(), cmp2());
    for (vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it) {
        cout << *it << " ";
    }
    cout << "\nbound = " << *bound;
    return 0;
}

C++ STL partition()函式官方實現