1

我有两个向量

std::vector<std::string> outputStack, operatorStack;

在某些时候,我需要从一个堆栈中弹出一些元素并将其推入另一个堆栈。

while(operatorStack.back().compare(L_BRACKET)) {
    outputStack.push_back(operatorStack.pop_back());
}

但是,eclipse 会抛出一个错误,无效的参数。但是当我输入强制转换输入时工作正常。

outputStack.push_back((std::string)operatorStack.pop_back());

现在,为什么需要这种类型转换?我正在阅读(主要是在 C++ Primer 中)根据 C++11 需要避免类型转换。

4

3 回答 3

7

std::vector::pop_back()返回void。你需要得到第back()一个,然后弹出它。

outputStack.push_back(operatorStack.back());
operatorStack.pop_back();

pop出于异常安全原因,这在标准库容器函数中很常见。返回 pop 的 value_type 通常意味着复制构造,这可能会抛出,这意味着容器将丢失调用者未成功复制的元素。所以pop()back()front()操作是分开的。

于 2013-02-13T23:22:36.083 回答
4

pop_back不返回元素。它有一个无效的回报。即使 Eclipse 没有抱怨,如果该演员表能够编译,我会感到震惊(它肯定不应该)。

由于pop_back在 C++ 中实际上并不返回弹出的元素,因此您需要先抓取它back

于 2013-02-13T23:22:45.567 回答
1

您需要使用std::vector::back()来获取最后一个元素的值,而不是std::vector::pop_back,因为 pop_back 只是从后面删除元素并返回 void。

Also need to compare std::string::compare with std::string::npos

while(operatorStack.back().compare(L_BRACKET) == 0) {
    outputStack.push_back(operatorStack.back());
    operatorStack.pop_back();
}
于 2013-02-13T23:25:19.217 回答