types — Typecasting для операции обратного вектора в Stack Overflow

У меня есть два вектора

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 нужно избегать приведения типов.

1

Решение

std::vector::pop_back() возвращается void, Вам нужно получить back() первый, затем поп это.

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

Это довольно часто встречается в стандартном контейнере библиотеки pop функции, в целях безопасности. Возвращаемое значение value_type, как правило, подразумевает конструкцию копирования, которая может выдавать, что означает, что контейнер потеряет элемент, который не был успешно скопирован вызывающей стороной. Так pop() а также back() или же front() операции разделены.

7

Другие решения

pop_back не возвращает элемент. Он имеет пустое возвращение. Даже при том, что Затмение не жалуется, я был бы потрясен, если тот бросок скомпилирует (это, конечно, не должно).

поскольку pop_back в C ++ на самом деле не возвращает всплывающий элемент, вам нужно захватить его с back первый.

4

Вам нужно использовать std::vector::back() чтобы получить значение последнего элемента вместо станд :: вектор :: pop_back так как pop_back просто удаляет элемент из back и возвращает void.

Также нужно сравнить std::string::compare с std::string::npos

while(operatorStack.back().compare(L_BRACKET) == 0) {
outputStack.push_back(operatorStack.back());
operatorStack.pop_back();
}
1
По вопросам рекламы [email protected]