参考:
函数模版:
template <class BidirectionalIterator, class UnaryPredicate>
BidirectionalIterator stable_partition (
BidirectionalIterator first,
BidirectionalIterator last,
UnaryPredicate pred);
稳定排序,将原来的范围划分成两部分。重新将[first,last)中的元素排序,所有符合一元谓词条件的返回true,不符合的返回false。和std::partition不同的是,stable_partition是稳定的,保持原有元素的相对顺序。
first,last:
指向序列中初始及最后元素的位置的双向迭代器(bidirectional iterator),范围是集合[first,last),即包括first,但不包括last,并且包括其他first到last的所有元素。
pred:
一元谓词就是返回bool类型(true或false)的一元表达式或者一元函数(Unary function)。
接受范围中的一个元素作为实参,返回bool类型的一个值,将所有返回true的元素放在返回false元素的前面,该一元函数不能修改其参数,可以是函数对象类型(function object)或者是函数指针类型(function pointer)。
返回值:
返回指向第二组(哪些使pred返回false)第一个元素的迭代器,或者第二组为空,返回last.
代码示例:
#include <iostream>
#include <vector>
#include <algorithm> //std::stable_partition
bool IsOdd(int input) {return (input %2) == 1; }
//this function can be replaced by lambda express
int main() {
std::vector<int> demo_vector;
//set some value
for(int i = 1; i < 10; ++i) {
demo_vector.push_back(i);
//add 1,2,3,4,5,6,7,8,9
}
std::vector<int>::iterator iBound;
//iBound = std::stable_partition(demo_vector.begin()
, demo_vector.end()
, IsOdd);
iBound = std::stable_partition(demo_vector,begin()
, demo_vector.end()
, [](int input) {return (input % 2) == 1;});
//Print out the content:
std::cout << "After reorder elements:";
for(int iNum : demo_vector) {
std::cout << iNum << ' ';
}
std::cout << '\n';
std::cout << "Odd element:";
for(std::vector<int>::iterator iter = demo_vector.begin()
; iter != iBound
; ++iter) {
std::cout << ' ' << *iter;
}
std::cout << '\n';
std::cout << "Even elements:";
for(std::vector<int>::iterator iter = iBound
iter != demo_vector.end()
; ++iter) {
std::cout << ' ' << *iter;
}
std::cout << '\n';
return 0;
}
程序输出:
After reorder elements: 1 3 5 7 9 2 4 6 8
Odd element: 1 3 5 7 9
Even elements: 2 4 6 8