陣列 (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. 宣告子:
識別項。
常數運算式的括號括住的整數類資料型別 []。 如果多個維度都使用額外的括號內所宣告的可省略常數運算式上的第一方括號組。
括號選擇性額外括住常數運算式。
3. 選擇性的初始設定式。 請參閱初始設定式。
將常數運算式都可以在陣列中的項目數。 陣列中的第一個項目是第 0 個項目,而最後一個項目 (n-1) 項目,其中 n 是該陣列可包含的項目數。 常數運算式必須是整數類資料型別,而且必須是大於 0。 只有當陣列的最後一個欄位的大小為零的陣列是合法的struct或等位以及何時啟用 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];
它會指定型別的陣列int、 在概念上排列在二維矩陣的五列和七個資料行,如下圖所示:
多維陣列的概念性配置
已經初始設定式清單的 multidimensioned 陣列宣告中 (如中所述初始設定式),可以省略常數運算式,指定第一個維度的界限。 例如:
// 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 }
};
上述的宣告定義一陣列,是由四個資料行的三個資料列。 資料列則代表工廠和資料行則代表工廠出貨的市場。 這些值會從工廠市場的運輸成本。 遺漏陣列的第一個維度,但編譯器填入它藉由檢查初始設定式。
本節主題:
範例
省略第一個維度的多維陣列的界限規格的技術也可用在函式宣告,如下所示:
// 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 ,加入新的工廠,不需要任何的程式碼變更,只需重新編譯會被寫入。