web-dev-qa-db-ja.com

std :: pairとstd :: Tupleの違いは2つのメンバーだけですか?

メンバーが2つだけのstd::pairstd::Tupleに違いはありますか? (std::pairは2つだけのメンバーを必要とし、Tupleは多かれ少なかれ...

72
Casey

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

  1. std::Tupleは決して standard-layout にはできません(少なくとも、標準ではrequiredではありません) 。 TYの両方が標準レイアウトの場合、すべてのstd::pair<T, Y>は標準レイアウトです。

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

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

73
Nicol Bolas

これは非常に遅い答えですが、std::pairはメンバー変数で定義され、そのサイズは 空の基本クラス最適化firstsecondを使用して最適化できません。空のクラス)。これは、アライメントの要件によって悪化しましたsecond_typeがあるため、最悪の場合、結果のstd::pairは、基本的に必要なサイズの2倍になります。

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

26
Stephen Lin

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

つまり、std::pairは2つの値しか持つことができません-0、1、3、またはそれ以上ではありません。 2つの値。ただし、Tupleには、値の数にセマンティックな制限はほとんどありません。したがって、std::pairは、実際に値のペアを指定する場合に使用する、より正確でタイプセーフなタイプです。

22
Arafangion

価値があるものとしては、std :: TupleのGDB出力が読みにくいことがわかります。明らかに、3つ以上の値が必要な場合、std :: pairは機能しませんが、これは構造体に有利な点だと考えています。

3
tgoodhart

C++ 17では、同じインターフェイスを使用して、2つの要素を持つペアとタプルの両方からデータを読み取ることができます。

auto [a, b] = FunctionToReturnPairOrTuple();

get<>を使用する必要はありません:)

2
bhardwajs