2017-01-30 21 views
-4

C++の構造体と配列の間に類似点はありますか?C++:構造と配列の類似点

私は、ユーザー定義のデータ型とそれ以外のものが異なるため、この種の質問は連続したメモリ位置記憶域を持つデータ型であると考えていました。

+0

問題がありますか? – AMS

+2

あなたが探している答えの種類はあまり明確ではありません。実際には構造体と配列の間に類似点はありません。どのような類似点を望んでいたのですか?彼らはまったく別のものです –

+0

「物」を含んでいますか? – Drop

答えて

3

構造体と配列に共通するものがいくつかありますが、一般的には概念的に分離していると考えられます。どちらかを使用できる状況の1つは、すべて同じタイプの既知の数の変数を保存する場合です。

保存しているデータが異なるコンテキストで同じ意味を持つシリーズである場合は配列を使用することをお勧めします。各値が異なる意味を持つ場合は構造体を使用することをお勧めします。

など。

1週間の一連の最高温度値を保存します。

std::array<int, 7> week_max_temperatures; 

あなたが一日の最大値と最小温度と総雨量を保存する:各値の意味は、あなたが、配列を使用するように、すべては、最高温度である、と同じです。各値の型はint、同じですが、意味が異なっているので、あなたが混乱最低温度、最高温度、および降雨を避けるために、構造体を使用します。ここでは

struct DailyWeatherData 
{ 
    int max_temperature_deg_c; 
    int min_temperature_deg_c; 
    int total_rainfall_mm; 
}; 

は、彼らの類似点と相違点のリストです:

構造体:

  • データメンバーは、異なるタイプの組み合わせであってもよいが、部材の種類及び数は、コンパイル時に固定されています。
  • 静的メソッドとインスタンスメソッドを持つことができます。
  • operator=()を使用してコピー可能です(コピーコンストラクタの削除やコピーが許可されていないメンバーが含まれている場合を除きます)。
  • (参照またはポインタとして渡されない限り)関数パラメータとして渡されるとコピーされます。
  • データはオブジェクトに格納されます。メモリに格納される場所は、ローカル変数として定義されているのか、newを使用して割り当てられているのかによって異なります。後者の場合は、メモリ管理を担当します。

Cスタイルの配列:

  • は、同じタイプのもの全てが要素の任意の数を含むことがあります。型はコンパイル時に設定され、実行時に配列が作成されるときに要素の数が設定されます。
  • ユーザー定義のメソッドを関連付けることはできません。
  • コピー可能ですが、std::copyまたはmemcpyではなく、operator=()です。
  • 関数パラメータとして渡されたときのポインタへの減衰。
  • データがメモリに格納される場所は、配列がローカル変数として作成されるか、new[]を使用して割り当てられるかによって異なります。後者の場合は、メモリ管理を担当します。どちらの場合でも、配列変数は実際のデータへのポインタのように機能します。

std::array

  • は、同じタイプのものであり、すべてのその要素を、任意の数を含む可能性があります。要素の型と数はコンパイル時に設定されます。
  • (サブクラス化を無視して)ユーザー定義のメソッドを関連付けることはできません。
  • operator=()を使用してコピーできます。
  • (参照またはポインタとして渡されない限り)関数パラメータとして渡されるとコピーされます。
  • データはオブジェクトに格納されます。通常はnewを使用して割り当てられないため、メモリ管理は問題になりません。

std::vector

  • は、同じタイプのものであり、すべてのその要素を、任意の数を含む可能性があります。型はコンパイル時に設定され、要素の数は実行時に変更される可能性があります。
  • (サブクラス化を無視して)ユーザー定義のメソッドを関連付けることはできません。
  • operator=()を使用してコピーできます。
  • (参照またはポインタとして渡されない限り)関数パラメータとして渡されるとコピーされます。
  • データはオブジェクトの外部に格納され、メモリ管理は自動的に処理されます。