![](/img/trans.png)
[英]use std::stable_partition and ::iterator with a vector
[英]What is the difference between std::stable_partition() and std::partition()?
stable_partition(vect.begin(), vect.end(), [](int x) { return x % 2 == 0; });
partition(vect.begin(), vect.end(), [](int x) {
return x % 2 == 0;
});
上面的代碼是為了解釋兩者之間的區別。
“穩定”意味着等效元素的順序不會改變:
來自cppreference.com 的std::stable_partition
:
重新排序范圍 [first, last) 中的元素,使得謂詞
p
為其返回true
所有元素位於謂詞p
為其返回false
的元素之前。 元素的相對順序被保留。
解決這個問題的最好方法可能是舉個例子。 讓我在這里抄襲cppreference 中的示例:
#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> v{0, 0, 3, 0, 2, 4, 5, 0, 7};
std::stable_partition(v.begin(), v.end(), [](int n){return n>0;});
for (int n : v) {
std::cout << n << ' ';
}
std::cout << '\n';
}
運行這個會得到: 3 2 4 5 7 0 0 0 0
。 3, 2, 4, 5, 7 等價於由> 0
謂詞定義的關系,並且正如預期的那樣,它們沒有重新排序。
但是,如果將stable_partition
替換為同一示例的partition
,則會得到: 7 5 3 4 2 0 0 0 0
。 這次不能保證保持等效元素的順序,顯然它不是。
如其他答案中所述, std::stable_partition
保留謂詞為其返回true
和false
的組中元素的相對順序。
但這需要付出代價: std::stable_partition
具有更高的時間/空間復雜度。 如果可以分配額外的存儲空間,則可以在O(n)
時間內實現std::stable_partition
。 然而,就地穩定分區不能在O(n)
時間內實現。 它可以在O(n log n)
時間內完成。 可以在此處找到一個簡單的分而治之算法的示例。
std::stable_partition
C++ 參考讀取:
復雜性(
std::stable_partition
)給定
N = last - first
,如果有足夠的額外內存,正好
N
應用謂詞和O(N)
交換。 如果內存不足,最多N log N
交換。
還要注意std::stable_partition
需要雙向迭代器,而std::partition
可以對前向迭代器進行操作。 但是,在雙向迭代器上效率更高:
復雜性(
std::partition
)鑒於
N = std::distance(first,last)
,謂詞的
N
應用。 至多N/2
互換如果ForwardIt
滿足的要求LegacyBidirectionalIterator
,和至多N
互換否則。
如果分區后元素的相對順序不重要,請使用std::partition
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.