我有两个载体
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,需要避免类型转换。
答案 0 :(得分:7)
std::vector::pop_back()
返回void
。您需要首先获取back()
,然后然后弹出它。
outputStack.push_back(operatorStack.back());
operatorStack.pop_back();
出于异常安全原因,这在标准库容器pop
函数中非常常见。返回pop的value_type通常意味着可能抛出的复制结构,这意味着容器将丢失一个未被调用者成功复制的元素。因此,pop()
和back()
或front()
操作是分开的。
答案 1 :(得分:4)
pop_back
不返回元素。它有一个无效的回报。即使Eclipse没有抱怨,如果该演员阵容将被编译(我肯定不应该),我会感到震惊。
由于C ++中的pop_back
实际上并未返回弹出元素,因此您需要先使用back
抓取它。
答案 2 :(得分:1)
您需要使用std::vector::back()
来获取最后一个元素的值而不是std::vector::pop_back,因为pop_back只是从后面移除元素并返回void。
还需要将std::string::compare
与std::string::npos
while(operatorStack.back().compare(L_BRACKET) == 0) {
outputStack.push_back(operatorStack.back());
operatorStack.pop_back();
}