web-dev-qa-db-ja.com

std :: stack .pop()メソッドの結果を変数に格納する

次のことを行いたいのですが。

_std::stack <int> s;
int h = 0;
s.Push(2);
h = s.pop();
_

たとえば、hに値2を保持させるなどです。自分のメソッドを試してみると、「void valueは無視されるべきではないので無視されません」というメッセージが表示されます。

これは.pop()メソッドの意図ではありませんか?これを行うための好ましい方法は何ですか?

24

標準ライブラリコンテナはtop()pop()を分離します。top()は最上位要素への参照を返し、pop()は最上位要素を削除します。 (そしてback()/pop_back()などについても同様です)。

この分離には十分な理由があり、popで最上位の要素を削除せずに戻さないでください。C++の基本原則の1つは、お金を払わないことです。あなたが必要としないもの。単一の関数では、要素を値で返す以外に選択肢がありませんが、これは望ましくない場合があります。懸念事項を分離することで、ユーザーはデータ構造の使い方に最も柔軟性をもたらします。 ( 元のSTLドキュメント の注3を参照してください。)

(奇妙なことに、concurrentコンテナの場合、popのような関数が実際にはforced最上位の値をアトミックに削除して返すため。同時コンテキストでは、「最上位」(または「空」である)などの概念はありません。これは、同時データ構造の明らかな例の1つです。保証を提供するために、パフォーマンスに大きな影響を与えます。)

39
Kerrek SB

以下を使用できます。

h = s.top();

その後、使用した後(最新の値を削除したい場合は、何もしないでください)

 s.pop();

同じように動作します!!

2
Marco167

実際にs.top()を使用して要素を格納し、それを使用して要素をポップすることができます

_s.pop().
_

使用する

_int h=s.top();
s.pop()
_

の代わりに

_int h=s.pop()
_

s.pop()はスタックから要素を削除して何も返さないため、s.pop()を一部のデータ型に直接割り当てることはできません。

0
user10059288