我试图了解如何推入,弹出和获取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);
}
推:如果传递具有正确类型的元素,请使用push_back
代替emplace_back
。emplace_back
使显式构造函数隐式化。因此,仅在有原因的情况下使用它。你必须使用std::move
有std::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] 删除。
我来说两句