C++ partition(STL partition)演算法使用
阿新 • • 發佈:2020-08-24
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 namespacestd; //以普通函式的方式定義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; }