31

重複の可能性:
2 つのフィールドを持つ構造体とペアを持つ構造体の使用の違いは何ですか?

親愛なるみんな、

ペアと構造体について少し質問があります。2 つのセルを持つ構造体の代わりに std::pair を使用する利点はありますか? 私はしばらくペアを使用してきましたが、主な問題は読みやすさです。たとえば、二重 (int "label"、double "value") を表現したい場合は、次のいずれかを使用できます。

typedef std::pair<int,double> myElem;

または

typedef struct {
    int label;
    double value;
} myElem;

ステートメントに「セマンティック」な意味がある場合、コードはより読みやすくなります (x.label が何であるかは常にわかりますが、x.first の場合はそうではありません)。

ただし、ペアを使用する利点はあると思います。それはよりパフォーマンスが高いですか、それとも何か他のものですか?

4

5 に答える 5

28

パフォーマンスの面では、何も変更する可能性は低く、単に砂糖でコーティングしているだけです。

使いやすさの点では、カスタム構造体を使用したいと思います。これは、次のように宣言できます (ちなみに):

struct MyElement
{
  int label;
  double value;
};

私は強力な型付けの強力な支持者であり、つかの間のもの以上のものである場合はいつでも、アドホックなタプルよりも「実際の」構造 (さらに良いことに、クラス) を好みます。

主な理由:

  • あなたが指摘したように、あまり意味がfirstありませんsecond
  • メソッドやその他のフィールドをstd::pair
  • クラス不変条件をstd::pair

全体として、フリーサイズのタプルであるカスタムの専用構造を使用することで、メンテナンスが有利になると本当に思います。

于 2010-08-31T09:31:13.650 に答える
9

Apairはテンプレート化された として実装されstructます。(通常は異種の) ペアを作成するための省略形を提供します。また、 で使用できる型にはいくつかの制約がありますpair

タイプ要件

T1 と T2 は両方とも Assignable のモデルでなければなりません。追加の操作には追加の要件があります。ペアのデフォルト コンストラクタは、T1 と T2 の両方が DefaultConstructible の場合にのみ使用できます。

(SGI STLstd::pairドキュメントより)

タイプがこれらの制約のいずれにも従わない場合、またはそれらを気にしない場合は、独自の POD を定義することが理にかなっています。

最後に、それは個人的な選択/コーディング スタイルの問題だと思います。

于 2010-08-31T08:43:57.380 に答える
7

その主な利点は、汎用であることです。たとえば、 から何かを取得するstd::mapと、 キーと関連する値が の 1 番目と 2 番目の項目として取得されますstd::pair

同様に、 を使用std::equal_rangeしてコレクション内の一連の等しい値を検索すると、範囲の最初と最後への反復子が の最初と 2 番目の項目として取得されますstd::pair

これらの両方に適用される意味のあるラベルを想像するのは難しいため、あまり意味のないカップルに落ち着きましたが、少なくとも誤解を招くことはありません. 'key' と 'data' の使用は では機能しますがstd::map、 では誤解を招く可能性があります (また、でそれらをより意味のあるものにするためにやstd::equal_rangeのようなものに切り替えた場合、 のアイテムでも同様に間違っています)。lower_boundupper_boundstd::equal_rangestd::map

于 2010-08-31T08:45:30.443 に答える
5

ただし、ペアを使用する利点はあると思います。それはよりパフォーマンスが高いですか、それとも何か他のものですか?

結局のところ、インスタンス化されたstd::pairものは単なる ,であるとは思えません。ただし、定義されています。しかし、メンバーが 2 人しかいない場合、それを自分で行うのはそれほど難しいことではありません。structstd::pairoperator<struct

したがって、私は通常、あなたが推論したようにします。専用のメンバー名を持つ aは、 andstructよりも読みやすいです。firstsecond

于 2010-08-31T08:43:00.513 に答える
4

std::pair を使用すると、select1st や select2nd などの STL のファンクターを自由に使用できます。同様に、operator< などの他の汎用関数をペアで使用できます。確かに、boost/tr1 の出現により、bind を使用してほぼ同じ効果を得ることができました。

ただし、読みやすさについてのあなたの指摘は非常に真実です。

于 2010-08-31T08:45:21.230 に答える