[英]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::vector
和std::list
滿足除std::deque
之外的要求)並且如果該容器是連續的,則該堆棧也是連續的。
例如,
stack<int, vector<int>> s;
是連續的,因為std::vector
是連續的。
std::stack
的連續性由其底層容器的連續性決定。
std::stack
是連續的嗎? 我會說,沒關系。 std::stack
不是容器,而是適配器,其思想是堆棧抽象和對接口的刻意限制。
即使它是連續的,以任何方式訪問std::stack
的元素,但.top()
將違反其語義。 如果你需要這樣的訪問,你首先不應該使用std::stack
。 不要混淆您的代碼的讀者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.