間に差があるstd::pair
と、std::tuple
2人のだけのメンバーとは?(std::pair
2つだけのメンバーを必要としtuple
、多かれ少なかれ持っているかもしれないという明白なことに加えて...)
回答:
いくつかの違いがあります:
std::tuple
標準レイアウトによるものにすることはできません(少なくとも、標準によるものである必要はありません)。とがstd::pair<T, Y>
両方とも標準レイアウトである場合、すべてが標準レイアウトです。T
Y
の内容を取得するpair
方がtuple
。よりも少し簡単です。ケースは単なるメンバーフィールドですがtuple
、pair
ケースでは関数呼び出しを使用する必要があります。
しかし、それはそれについてです。
std::map
用途をstd::pair<const Key,T>
としてvalue_type
も、C ++ 11インチ タプルはどこで使用されていstd::map
ますか?
std::map
。
これは、ことが非常に遅く答えが、ノートであるstd::pair
メンバ変数で定義され、そのサイズは使用して最適化することができない空の基底クラスの最適化を(first
そしてsecond
一方または両方が空クラスの場合でも、個別のアドレスを占有しなければなりません)。これsecond_type
は、アライメント要件が何であれ悪化するため、最悪の場合、結果としてstd::pair
は基本的に必要なサイズの2倍になります。
std::tuple
ヘルパー関数を介したアクセスのみを許可するため、どちらかが空の場合はどちらのタイプからも派生でき、オーバーヘッドを節約できます。GCCの実装は、少なくとも、間違いなくこれを行います...ヘッダーを調べてこれを確認できますが、証拠としてこれもあります。
[[no_unique_address]]
std::pair
はの欠点を取り除くはずです。
アンstd::tuple
の名前が長い(1つの余分な文字)です。これらの文字の多くは右手で入力されるため、ほとんどの人が簡単に入力できます。
とはstd::pair
いえ、値は2つだけで、0、1、3、またはそれ以上にすることはできません。2つの値。ただし、タプルには、値の数に意味上の制限はほとんどありません。アンはstd::pair
、したがって、あなたが実際の値のペアを指定したい場合に使用する安全なタイプを入力し、より正確です。
std::tuple<>
ありませんまた、タイプセーフ(?それはどのようになることができませんでした)、そして2
何よりも意味的に異なっていますpair
。
.first
と.second
は便利ですが、コードの変更で3番目(またはそれ以上)のメンバーが必要な場合は役に立ちません。std::get
ゲッターに関係なく、すべてを変更する必要はなく、データ型とmake_pair
呼び出しの呼び出しだけを変更する必要があることに気づきましたmake_tuple
。