1

我试图了解如何推送、弹出和获取 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);
}
4

2 回答 2

4

PUSH:如果您传递具有正确类型的元素,请使用push_back而不是。使显式构造函数隐式。所以只有在有原因的情况下才使用它。您必须使用with ,因为不可复制。emplace_backemplace_backstd::movestd::unique_ptrstd::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。为了保持一致,我会返回 astd::unique_ptr<Estado>而不是 a Estado*

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

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

void pop() noexcept
{
    vecEstados.pop_back();
}
于 2013-10-12T20:02:34.577 回答
0

正如 P0W 提到的,std::stack 已经存在。我也同意 nosid 的回答。

我想这个练习有点多余,但为了模仿 std::stack 提供的接口(或其中的一部分),我建议如下:

template<class Type>
class LisoStack
{
public:
    LisoStack() : mStack() {}

    // Push onto the top of the stack
    Type push(const Type& val)
    { 
        mStack.push_back(std::move(val));
    } 

    // Get the element at the top
    Type& top()
    { 
        return mStack.back();
    } 

    // Get the element at the top
    const Type& top() const
    { 
        return mStack.back();
    } 

    // Remove the element at the top
    void pop() noexcept
    {
        mStack.pop_back();
    }

private:
    std::vector<Type> mStack;
};
  1. 使容器通用的模板。
  2. 将 get_top() 替换为 top() 并执行 .back() 以提供向量后面(堆栈顶部)的元素。提供 const 和非常量版本。
  3. pop() 只需调用 vector.pop_back() 即可执行您想要的操作 - 删除最后一个元素(堆栈顶部)。
  4. 正如 nosid 提到的,在您的情况下更喜欢 push_back() (请注意,这也保持与 C++11 之前的编译器的兼容性)。您可以选择实现一个单独的 emplace() 函数,就像 std::stack 提供的那样。
于 2013-10-12T20:31:13.883 回答