1

私は2つのベクトルを持っています

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()を返しますvoidback()最初に取得してからポップする必要があります。

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

popこれは、例外安全上の理由から、標準ライブラリコンテナ関数では非常に一般的です。ポップを返すvalue_typeは、通常、コピー構造を意味します。これは、スローされる可能性があります。つまり、コンテナーは、呼び出し元によって正常にコピーされなかった要素を失います。したがってpop()、およびback()またはfront()操作は分離されます。

于 2013-02-13T23:22:36.083 に答える
4

pop_back要素を返しません。ボイドリターンがあります。Eclipseは文句を言っていませんが、そのキャストがコンパイルされるとしたらショックを受けます(間違いなくコンパイルされるべきではありません)。

pop_backC ++では実際にはポップされた要素が返されないため、最初にそれを取得する必要がありますback

于 2013-02-13T23:22:45.567 に答える
1

pop_backは単に要素を後ろから削除してvoidを返すため、 std :: vector::pop_backstd::vector::back()の代わりに最後の要素の値を取得するために使用する必要があります。

また、と比較する必要がありstd::string::compareますstd::string::npos

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