配列 (C++)
配列は同様なオブジェクトのコレクションです。 配列の最も簡単な例は、次のシーケンスで宣言できるベクターです。
decl-specifier identifier [ constant-expression ]
decl-specifier identifier []
decl-specifier identifer [][ constant-expression] . . .
decl-specifier identifier [ constant-expression ]
[ constant-expression ] . . .
1. 宣言指定子:
ストレージ クラスの指定子 (省略可能)。
const/volatile 指定子 (省略可能)。
配列要素の型の名前。
2. 宣言子:
識別子。
角かっこ [] で囲んだ整数型の定数式。 多次元が追加の角かっこを使用して宣言されている場合、1 組目のかっこで定数式を省略してもかまいません。
定数式を囲む追加の山かっこ (省略可能)。
3. 初期化子 (省略可能)。 「初期化子」を参照してください。
配列の要素の数は、定数式によって取得できます。 配列の最初の要素は 0 番目の要素で、最後の要素は (n-1) 番目の要素です。n は配列が含む要素の数です。 constant-expression は、0 より大きい整数型であることが必要です。 サイズ 0 の配列は、配列が struct または union の最後のフィールドで、Microsoft 拡張機能 (/Ze) が有効な場合にのみ有効です。
次の例では、実行時に配列を定義する方法を示します。
// arrays.cpp
// compile with: /EHsc
#include <iostream>
int main() {
using namespace std;
int size = 3, i = 0;
int* myarr = new int[size];
for (i = 0 ; i < size ; i++)
myarr[i] = 10;
for (i = 0 ; i < size ; i++)
printf_s("myarr[%d] = %d\n", i, myarr[i]);
delete [] myarr;
}
配列は派生型であるため、関数、参照、および void を除く他の派生型または基本型から生成できます。
他の配列から生成された配列は、多次元配列です。 これらの多次元配列は、角かっこで囲まれた定数式を複数並べることで指定されます。 たとえば、次の宣言について考えます。
int i2[5][7];
これは、5 行 7 列の 2 次元行列に概念的に並べられる int 型の配列を指定します。
多次元配列の概念レイアウト
初期化子リスト (「初期化子」を参照) がある多次元配列の宣言では、最初の次元の範囲を指定する定数式を省略できます。 次に例を示します。
// arrays2.cpp
// compile with: /c
const int cMarkets = 4;
// Declare a float that represents the transportation costs.
double TransportCosts[][cMarkets] = {
{ 32.19, 47.29, 31.99, 19.11 },
{ 11.29, 22.49, 33.47, 17.29 },
{ 41.97, 22.09, 9.76, 22.55 }
};
前の宣言は、3 行 x 4 列の配列を定義します。 行はファクトリを表し、列はファクトリの出荷先のマーケットを表します。 値は、ファクトリからマーケットへの輸送コストです。 配列の最初の次元は省かれますが、コンパイラは初期化子を調べることによってこれを入力します。
このセクションのトピック
使用例
多次元配列の最初の次元の境界指定を省略する手法は、次のとおり関数宣言で使用することもできます。
// multidimensional_arrays.cpp
// compile with: /EHsc
// arguments: 3
#include <limits> // Includes DBL_MAX
#include <iostream>
const int cMkts = 4, cFacts = 2;
// Declare a float that represents the transportation costs
double TransportCosts[][cMkts] = {
{ 32.19, 47.29, 31.99, 19.11 },
{ 11.29, 22.49, 33.47, 17.29 },
{ 41.97, 22.09, 9.76, 22.55 }
};
// Calculate size of unspecified dimension
const int cFactories = sizeof TransportCosts /
sizeof( double[cMkts] );
double FindMinToMkt( int Mkt, double myTransportCosts[][cMkts], int mycFacts);
using namespace std;
int main( int argc, char *argv[] ) {
double MinCost;
if (argv[1] == 0) {
cout << "You must specify the number of markets." << endl;
exit(0);
}
MinCost = FindMinToMkt( *argv[1] - '0', TransportCosts, cFacts);
cout << "The minimum cost to Market " << argv[1] << " is: "
<< MinCost << "\n";
}
double FindMinToMkt(int Mkt, double myTransportCosts[][cMkts], int mycFacts) {
double MinCost = DBL_MAX;
for( int i = 0; i < cFacts; ++i )
MinCost = (MinCost < TransportCosts[i][Mkt]) ?
MinCost : TransportCosts[i][Mkt];
return MinCost;
}
コメント
FindMinToMkt 関数は、新しいファクトリを追加してもコード変更の必要はなく、再コンパイルだけすればいいように書かれています。