109

メンバーが 2 つだけのstd::pairと の間に違いはありますか? ( 2 つだけのメンバーを必要とし、多かれ少なかれ持つことができるstd::tupleという明白なことに加えて...)std::pairtuple

4

6 に答える 6

110

いくつかの違いがあります:

  1. std::tuple標準では、 standard-layoutである必要はありません。とstd::pair<T, Y>の両方が標準レイアウトの場合、すべてが標準レイアウトです。TY

  2. apairよりも aの内容を取得する方が少し簡単tupleです。ケースは単なるメンバーフィールドですがtuple、ケースでは関数呼び出しを使用する必要があります。pair

しかし、それはそれについてです。

于 2011-07-14T00:12:54.723 に答える
40

Anstd::tupleの名前が長くなります (1 文字余分に)。これらの文字の多くは右手で入力されるため、ほとんどの人が入力しやすくなっています。

つまり、std::pair0、1、3、またはそれ以上ではなく、2 つの値しか持てません。2 つの値。ただし、タプルには、値の数に関する意味上の制限はほとんどありません。したがって、値のstd::pairペアを実際に指定する場合は、より正確でタイプ セーフな型を使用できます。

于 2011-07-14T00:14:04.250 に答える
32

これは非常に遅い回答ですが、メンバー変数で定義されているため、空の基本クラスの最適std::pair化を使用してそのサイズを最適化することはできません(一方または両方が空のクラスであっても、個別のアドレスを占有する必要があります) 。これは、アライメント要件が何であれ悪化するため、最悪の場合、結果は基本的に必要なサイズの 2 倍になります。firstsecondsecond_typestd::pair

std::tupleヘルパー関数を介したアクセスのみを許可するため、どちらか一方が空の場合、どちらかの型から派生させることができ、オーバーヘッドを節約できます。GCC の実装は、少なくとも、間違いなくこれを行います...ヘッダーを調べてこれを確認できますが、証拠としてこれもあります。

于 2013-02-26T05:53:12.087 に答える
3

価値があるのは、std::tuple の GDB 出力がはるかに読みにくいことです。明らかに、2 つ以上の値が必要な場合、std::pair は機能しませんが、これは構造体を支持するポイントと考えています。

于 2011-07-26T15:45:45.563 に答える