簡體   English   中英

std::stack 是連續的嗎?

[英]Is std::stack contiguous?

我想找到堆棧中的最大元素,並考慮使用std::max_element

然后我才知道std::stack沒有begin()end()函數。 在網上沖浪后,我看到了一個 hack:

stack<int> s({0, 1, 2, 3, 4, 5, 6, 7, 8, 9});
auto end = &s.top() + 1;     // instead of std::end
auto begin = end - s.size(); // instead of std::begin
cout << "Max = " << *max_element(begin, end);

好像還可以,網上可以看

但是當我提交我的代碼時,它失敗了一些測試用例。 std::stack真的是連續的嗎?

它取決於std::stack的底層容器:

template <class T, class Container = deque<T>> class stack;

class 模板充當底層容器的包裝器

默認情況下, Container = deque<T> 並且std::deque不連續:

雙端隊列的元素不是連續存儲的

所以,

stack<int> s;

不連續,因為std::deque不連續。

然而,

std::deque的典型實現)使用一系列單獨分配的固定大小 arrays

這就是一些測試用例失敗的原因; 當堆棧增長到超過底層固定大小 arrays 之一的大小時,連續性就會中斷。


如果顯式指定了底層容器(標准容器std::vectorstd::list滿足除std::deque之外的要求)並且如果該容器是連續的,則該堆棧也是連續的。

例如,

stack<int, vector<int>> s;

是連續的,因為std::vector是連續的。


TLDR

std::stack的連續性由其底層容器的連續性決定。

我還要感謝社區向我展示了人們如何找到此類編程問題的答案並使我能夠從參考資料中挖掘解決方案。

std::stack是連續的嗎? 我會說,沒關系。 std::stack不是容器,而是適配器,其思想是堆棧抽象和對接口的刻意限制。

即使它是連續的,以任何方式訪問std::stack的元素,但.top()將違反其語義。 如果你需要這樣的訪問,你首先不應該使用std::stack 不要混淆您的代碼的讀者。

暫無
暫無

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

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