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