簡體   English   中英

是否有 C++ function 對 std::stack 進行排序?

[英]Is there a C++ function to sort a std::stack?

我的代碼中有一個std::stack ,我需要對其進行排序。 有沒有內置的 function 可以做到這一點? 由於std::stack沒有std::end 我可以使用std::sort還是必須 go 以使用輔助堆棧對原始堆棧進行排序的相同舊方法?

std::stack不是容器,而是容器適配器。

因此,鑒於它的預期語義——

充當底層容器的包裝器 - 僅提供一組特定的功能。

——這是一個你無法對其進行排序的功能。

由於構造函數將任何給定容器復制到堆棧中,直接對堆棧 object 進行排序的唯一方法是對底層容器成員 object 進行排序:

成員對象

Container c底層容器(受保護的成員對象)

要做到這一點,您需要從堆棧中派生一個新的自定義類型,所有令人頭疼的問題都源自 class 涉及的標准容器。

可能有一個 std::stack::sort 模板使用兩個輔助堆棧和多相合並排序(時間復雜度 O(n log(n)),見下文),或者該模板可能已經基於底層容器類型實現: std::deque、std::list 或 std::vector,因為可以為 std::stack 指定容器類型,例如:

    std::stack <int, std::vector<int>> mystack;

std::sort 可用於 std::deque 或 std::vector(兩者都有隨機訪問迭代器),而 std::list::sort 可用於 std::list。 我不知道 std::stack 是否允許其他容器類型或自定義容器類型; 如果允許,這將導致嘗試基於容器類型創建 std::stack::sort 的問題。

使用輔助堆棧對原始堆棧進行排序

具有一個輔助堆棧的堆棧排序具有 O(n^2) 時間復雜度。 具有兩個輔助堆棧的堆棧排序,基於多相歸並排序,具有 O(n log(n)) 時間復雜度,但代碼復雜。 將堆棧移動到數組或向量,對數組或向量進行排序,然后創建一個新的排序堆棧會更快。

如果您對 3 個堆棧(原始堆棧和 2 個輔助堆棧)的多相合並排序感到好奇,我編寫了鏈接到下面的示例。 這些使用基於數組的自定義堆棧容器,並且與數組上的標准合並排序一樣快,但需要 2 個臨時堆棧。

很久以前,多相合並排序被用於磁帶驅動器。 一些磁帶驅動器可以向后讀取,以避免倒帶時間,本質上使它們像容器一樣堆疊(向前寫入,向后讀取)。 對於磁帶驅動器,可以使用不同大小的文件標記或記錄來指示運行結束,從而無需跟蹤代碼的運行邊界。 許多商業多相歸並排序程序的高級版本是專有的,隨着磁帶排序逐漸消失在歷史中,這些知識基本上隨着時間的推移而丟失。

https://stackoverflow.com/a/38419908/3282056

template <class T, class U, class Compare>
void sort_stack(std::stack<T,U> &stack, Compare comp)
{
    std::vector<T> tmp_container;
    tmp_container.reserve(stack.size());
    while(!stack.empty())
    {
        tmp_container.push_back(std::move(stack.top()));
        stack.pop();
    }
    std::sort(tmp_container.begin(), tmp_container.end(), comp);
    for(auto it:tmp_container)
    {
        stack.push(std::move(it));
    }
}
template <class T, class U>
void sort_stack(std::stack<T,U> &stack)
{
    sort_stack(stack, std::less<T>());
}

據我所知,沒有辦法就地對堆棧進行排序。 但一種解決方法是使用額外的空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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