將[First, Last)區間中令_Pred(elem)爲true的元素向前移動
返回令_Pred爲false的第一個元素位置.
將[First, Last)區間中令_Pred(elem)爲true的元素向前移動
返回令_Pred爲false的第一個元素位置.
兩者差別是:不管元素是否滿足給定準則,stable_partition會保持它們之間的相對次序
複雜度:partition():線性,共執行_Pred()numElems次,以及最多numElems/2次交換.
stable_partition:如果系統擁有足夠內存,那麼就是線性複雜度,執行_Pred()及交換共numElems次,如果沒有足夠內存,就是nlogn複雜度,執行_Pred()numElems X log(numElems)次
使用例子:
template<typename T>
inline void INSERT_ELEMENTS(T& coll, int first, int last)
{
for (int i = first; i <= last; ++i)
{
coll.insert(coll.end(), i);
}
}
template<typename T>
inline void PRINT_ELEMENTS(const T & coll, const string& optcstr = "")
{
cout << optcstr;
for (auto elem : coll)
{
cout << elem << ' ';
}
cout << endl;
}
int main()
{
vector<int>a;
vector<int>b;
INSERT_ELEMENTS(a, 1, 9);
INSERT_ELEMENTS(b, 1, 9);
PRINT_ELEMENTS(a, "a: ");
PRINT_ELEMENTS(b, "b: ");
cout << endl;
auto pos1 = partition(a.begin(), a.end(), [](int elem) {return elem % 2 == 0; });
auto pos2 = stable_partition(b.begin(), b.end(), [](int elem) {return elem % 2 == 0; });
PRINT_ELEMENTS(a, "a: ");
cout << "first odd element: " << *pos1 << endl;
PRINT_ELEMENTS(b, "b: ");
cout << "first odd element: " << *pos2 << endl;
}