簡體   English   中英

std::stable_partition() 和 std::partition() 有什么區別?

[英]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保留謂詞為其返回truefalse的組中元素的相對順序。

但這需要付出代價: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM