C 標準ライブラリでは、std::queueコンテナは、先入れ先出し (FIFO) データ構造を管理するための操作を提供します。その重要な操作の 1 つは、キューから最も古い要素を削除して取得する Pop() です。ただし、他のコンテナとは異なり、pop() は値を返しません。代わりに、front() を使用してキューの先頭の値を検査する必要があります。
値が返されない理由
この設計選択の理由は次のとおりです。オブジェクトの作成または割り当て中に例外が発生する可能性があります。ポップされるオブジェクトがコピー コンストラクターの呼び出し中に例外をスローする状況を考えてみましょう。 Pop() がポップされた要素を返す単純な実装では、例外が処理される前にキューの状態が (基になる要素を削除することによって) 変更されます。これにより、キューが無効な状態のままになります。
例
これを説明するために、ポップされた値を値ごとに返す仮説的な Pop() 実装を考えてみましょう。
template<class T> class queue { T* elements; std::size_t top_position; // ... T pop() { T x = elements[top_position]; --top_position; return x; // Calls T(const T&) which may throw } };
T のコピー コンストラクターが戻り時に例外をスローした場合、キューの状態 (top_position) は次のようになります。すでに変更されているため、ポップされた要素が失われます。
効率的かつ安全な実装
より効率的で安全な実装には、削除操作と取得操作を 2 つに分離することが含まれます。個別の操作:
このアプローチでは、効率と例外の安全性の両方を確保しながら、クライアントは、フロント要素を削除する前に検査する必要があります。
以上がC の `std::queue::pop()` と `std::queue::front()` の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。