如何使用std :: vector实现堆栈?

利索瓦卡罗

我试图了解如何推入,弹出和获取std :: vector的顶部,这基本上是c ++中带有向量的堆栈的实现。

我的实现可以完全正常运行,但是我不确定它是否可以正常处理资源,如果可以的话,还不错。我还没有找到很多这样的示例,因此可以为他人提供帮助。如果这样做不可行,请提供有关如何改进它,可能出现的错误等信息。

这是我当前的代码:

std::vector<std::unique_ptr<Estado>> vecEstados;
// PUSH
void push(Estado *es){
vecEstados.emplace_back(es); // (MENU IS A SUBCLASS OF ESTADO)
}
// GET TOP
Estado *get_top()
{
    return vecEstados.back().get();
}
// POP (THIS SHOULD JUST ERASE LAST ITEM)
void pop()
{
    vecEstados.erase(vecEstados.end()-1);
}
Nosid

推:如果传递具有正确类型的元素,请使用push_back代替emplace_backemplace_back使显式构造函数隐式化因此,仅在有原因的情况下使用它。你必须使用std::movestd::unique_ptr,因为std::unique_ptr是不可拷贝。

vecEstados.push_back(std::move(es));

如果创建一个新元素,则可以使用std::make_unique它(如果可用)(C ++ 14)。但是,在这种情况下,这并不重要:

vecEstados.emplace_back(std::make_unique<Menu>());
vecEstados.push_back(std::unique_ptr<Estado>(new Menu{}));

顶部:如果您不打算修改返回的对象,请创建函数const为了保持一致,我将返回std::unique_ptr<Estado>而不是Estado*

const std::unique_ptr<Estado>& get_top() const
{
    return vecEstados.back();
}

POP:您应该使用pop_back删除的最后一个元素std::vector您还可以使用声明函数noexcept,因为这样可以更轻松地编写正确的清理代码。

void pop() noexcept
{
    vecEstados.pop_back();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何实现堆栈上堆栈?

来自分类Dev

std :: vector :: swap如何实现?

来自分类Dev

std :: vector :: swap如何实现?

来自分类Dev

java是如何实现堆栈的?

来自分类Dev

使用数组实现堆栈

来自分类Dev

关于如何使用圆形数组实现std :: vector的建议?

来自分类Dev

在Vector实现中如何正确使用std :: allocator <T>

来自分类Dev

如何实现std :: vector插入?C ++

来自分类Dev

如何使我的std :: vector实现更快?

来自分类Dev

如何实现堆栈向量?

来自分类Dev

使用函数调用实现堆栈

来自分类Dev

使用链表实现堆栈损坏

来自分类Dev

使用 o(1) 实现堆栈

来自分类Dev

std :: vector <bool>优化实现

来自分类Dev

使用调用堆栈在C中实现堆栈数据结构?

来自分类Dev

OS如何实现或维护每个线程的堆栈?

来自分类Dev

通常如何实现队列和堆栈?

来自分类Dev

如何实现堆栈列表的擦除功能?

来自分类Dev

如何实现不重叠的div堆栈?

来自分类Dev

使用堆栈实现优先级队列

来自分类Dev

使用2个堆栈实现队列

来自分类Dev

使用堆栈实现深度受限的路径查找

来自分类Dev

在Java中使用数组实现堆栈

来自分类Dev

使用数组,计数和索引实现堆栈

来自分类Dev

使用堆栈实现优先级队列

来自分类Dev

使用2个队列实现堆栈

来自分类Dev

在Java中使用数组实现堆栈

来自分类Dev

在我的实现中使用堆栈是否正确?

来自分类Dev

如何使用range :: actions :: insd with std :: vector