2012-02-28 77 views
0

如果我做的東西像一個撤消堆棧,我想只支持30撤消操作,這將是很好有一個堆棧過的30堆棧最大尺寸覆蓋C++

的最大深度你顯然不希望堆棧在這一點上限制增加,你只希望它在添加31st時放棄最底部的元素。

我知道我可以模仿這種功能有一個名單,但我不知道是否有一種方法,使其與STL發生或者有這個其他預先實施方案?

回答

6

我會用一個循環鏈接的列表(或只是一個緩衝區,您使用的圓)與30個節點(或要素)。您可以在同一個節點上開始頂部和底部的指針,並在每次添加元素時向頂部前進,並在刪除元素時將其倒退。如果你添加了許多到達底部的元素(你已經完成了整個循環),那麼你將頂部和底部指針向前移動,這樣它們就不會相互交叉,並覆蓋底部底部的指針指針(現在頂部指針指向的地方)。

另一種方式來做到這一點是分配數組(或vector繞到),而不是動態分配內存,並通過30 modulusing你的指標時,要提前一個索引。

無論哪種方式,你從來沒有分配或除了在開始釋放內存,你可以處理溢出真的很好。您可以閱讀Wikipedia page about circular buffers的詳細信息。

+3

我剛想回答「你想在這裏是什麼一個循環緩衝區「,它可以用簡單的std :: vector/deque/array封裝來實現。預先分配30個元素並迭代它們會比連續向列表頭部分配新元素同時刪除尾部元素(這最終會導致大量碎片)更加高效。 – Crashworks 2012-02-28 03:26:11

+1

@Crashworks爲什麼要麻煩? http://www.boost.org/doc/libs/1_49_0/libs/circular_buffer/doc/circular_buffer.html – Lalaland 2012-02-28 03:27:12

+0

這很好用,但使用標準容器有很多好處。 – 2012-02-28 03:28:09

1

我會用一個std::deque當尺寸變超過限制刪除元素。正如你所觀察到的那樣,列表當然也會起作用。

這裏沒有一個標準集裝箱來做到這一點。

1

std::dequestd::list都工作。您可以使用它們作爲堆棧使用push_back/pop_back和過期舊元素與pop_front