gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:40:01 25 4
gpt4 key购买 nike

我正在尝试了解如何压入、弹出和获取 std::vector 的顶部,这基本上是使用 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:使用 push_back而不是 emplace_back ,如果您传递了具有正确类型的元素。 emplace_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{}));

TOP: 如果您不打算修改返回的对象,那么将函数设为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();
}

关于c++ - 如何使用 std::vector 实现堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19338352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com