簡體   English   中英

如何獲得“基於堆棧”的 std::stack? (具有固定的最大尺寸)

[英]How to get a 'stack based' std::stack? (with fixed max size)

根據std::stack參考:

用於存儲元素的底層容器的類型。 容器必須滿足 SequenceContainer 的要求。 此外,它必須提供以下具有通常語義的函數:

 back() push_back() pop_back()

標准容器 std::vector、std::deque 和 std::list 滿足這些要求。 默認情況下,如果沒有為特定堆棧 class 實例化指定容器 class,則使用標准容器 std::deque。

所有這些都是基於堆的容器。

以下實際編譯( ):

std::stack<int, std::array<int, 12> > stack_of_months;

直到push被調用。

是否有一些技巧可以輕松包裝std::array以支持這些方法,以便可以在堆棧中使用它?

您應該能夠使用 Boost 的static_vector

static_vector是一個序列容器,類似於可以改變大小的連續存儲,以及static 分配、低開銷和固定容量

一個工作示例:

std::stack<int, boost::container::static_vector<int, 4>> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
// s.push(5); // would throw

@PaulMcKenzie 是的,它使用堆棧作為存儲(當然,如果 object 本身存儲在堆棧中):

static_vector中的元素數量可以動態變化,直至達到固定容量,因為元素存儲在 object 本身中,類似於數組。

現場演示: https://wandbox.org/permlink/Gi40FrB0yX8dIwfA

std::array包裝成std::stack可用的東西並不難,您只需要跟蹤有多少元素被推送和彈出:

#include <array>
#include <stack>
#include <iostream>

template < typename T, size_t Size >
struct static_vector
{
  using value_type = T;
  using reference = T&;
  using const_reference = const T &;
  using size_type = size_t;

  static_vector()
    : size( 0 )
  {
  }

  std::array< T, Size > data;
  size_t size;

  void push_back( const_reference value )
  {
    data.at( size ) = value;
    size++;
  }

  void pop_back()
  {
    if ( size == 0 )
    {
      throw std::runtime_error( "empty" );
    }
    size--;
  }

  const_reference back() const
  {
    if ( size == 0 )
    {
      throw std::runtime_error( "empty" );
    }
    return data[ size - 1 ];
  }

  reference back()
  {
    if ( size == 0 )
    {
      throw std::runtime_error( "empty" );
    }
    return data[ size - 1 ];
  }
};

int main()
{
  std::stack< int, static_vector< int, 4 > > stack;
  stack.push( 1 );
  std::cout << stack.top() << "\n";
  stack.push( 2 );
  std::cout << stack.top() << "\n";
  stack.pop();
  std::cout << stack.top() << "\n";
  stack.pop();
}

暫無
暫無

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

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