如何获得"基于堆栈"的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::d eque 和 std::list 满足 这些要求。默认情况下,如果没有为 指定容器类 特定的堆栈类实例化,标准容器 std:使用:d eque。
所有这些都是基于堆的容器。
以下实际编译(叮当(:
std::stack<int, std::array<int, 12> > stack_of_months;
直到push
被召唤。
是否有一些技巧可以轻松包装std::array
以支持这些方法,以便可以在堆栈中使用?
你应该能够使用 Boost 的static_vector
:
static_vector
是一个序列容器,类似于具有连续存储的容器,其大小可以更改,以及静态分配、低开销和固定容量。
一个工作示例:
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 是的,它使用堆栈作为存储(当然,如果对象本身存储在堆栈中(:
static_vector
中的元素数可能会在固定容量内动态变化,因为元素存储在对象本身中类似于数组。
现场演示: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();
}
相关文章:
- 无法让"std::enable_if"适用于无作用域枚举
- 在功能块中使用新运算符时存在于堆或堆栈上?
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- C++17 和更新的 std::分配器是否适用于动态数量的自定义堆?
- 对于多个字符(如 ETX/STX 对),是否有类似于 std::quote 的东西
- std::任何只用于移动的模板,其中副本ctor内的static_assert等于编译错误,但为什么
- 如何获得"基于堆栈"的std::stack?(具有固定的最大尺寸)
- C++类似于 std::map 的数据结构,具有多个键级别
- 使用 std::cin 的输入仅适用于浮点数,仅当值尾随字母"e"(大写和小写)时
- 使用 std::map 的递归堆栈分配如何工作?
- 自定义堆栈上 std::string 数据的输出
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 标准库中是否有相当于 Rust 的 'std::mem::d rop' 的C++?
- 为什么C++哈希函数的返回类型是 std::size_t,而不是独立于平台的类型?
- 为什么std::begin()和std::end()适用于固定数组,而不适用于动态数组
- 将 std::bind 应用于带有参数 <boost::asio::ip::tcp::socket> 时出错?
- 使用 std::make_unique 堆栈溢出,但不使用 RAW 指针
- Std::移动堆栈对象
- 为什么范围基本循环不适用于堆中的数组,但适用于堆栈中的数组
- 删除std::lock_guard相对于其他堆栈分配对象的顺序/速度