[解決済み] なぜ std::queue::pop は値を返さないのでしょうか?
質問
私はこのような ページ しかし、私は同じの理由を得ることができません。そこには次のように書かれています。
"値を全く返さない方が合理的であり クライアントがキューの先頭にある値を検査するために front() を使用することです。
しかし、front() から要素を検査するには、その要素を lvalue にコピーする必要もありました。たとえば、次のようなコード・セグメントがあります。
std::queue<int> myqueue;
int myint;
int result;
std::cin >> myint;
myqueue.push (myint);
/* ここで、RHSにtemporaryが作成され、resultに割り当てられます。 参照で返す場合は、ポップ操作の後に結果が無効になる */
result = myqueue.front(); //result.
std::cout << ' ' << result;
myqueue.pop();
5行目に カウト オブジェクトはまず myqueue.front() のコピーを作成し、それを result に代入しています。つまり、ポップ関数でも同じことができるのです。
解決方法は?
<ブロッククオートでは、何が違うのでしょうか。ポップアップ関数でも同じことができたはずです。
確かに同じことができたかもしれません。そうしなかった理由は、ポップした要素を返すポップは例外がある場合には安全でないからです(値で返す必要があるため、コピーを作成することになります)。
次のようなシナリオを考えてみましょう(私が言いたいことを説明するために、素朴で作り込まれたポップの実装を使用します)。
template<class T>
class queue {
T* elements;
std::size_t top_position;
// stuff here
T pop()
{
auto x = elements[top_position];
// TODO: call destructor for elements[top_position] here
--top_position; // alter queue state here
return x; // calls T(const T&) which may throw
}
T のコピーコンストラクタが return で投げる場合、キューの状態はすでに変更されています (
top_position
私の素朴な実装では)その要素はキューから削除され、返されません。どう考えても(クライアントコードでどのように例外をキャッチしても)キューの先頭の要素は失われています。
この実装は、ポップした値が不要な場合にも非効率です(つまり、誰も使わない要素のコピーを作ってしまう)。
これを安全かつ効率的に実装するためには、2つの別々の操作(
void pop
と
const T& front()
).
関連
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] コピーエリジョンと戻り値の最適化とは何ですか?
-
[解決済み】標準コンテナでstd::auto_ptr<>を使うのはなぜいけないのでしょうか?
-
[解決済み】なぜstd::mapは赤黒い木として実装されているのですか?
-
[解決済み] std::list::reverse の計算量が O(n) であるのはなぜですか?
-
[解決済み] std::queueを効率よくクリアするにはどうしたらよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較