D語言數組
D編程語言提供了一種數據結構,數組用於存儲相同類型的元素的一個固定大小的連續集合。數組是用於存儲數據的集合,但它往往認為陣列為相同類型的變量的集合。
相反聲明個彆變數,如number0, number1, ..., 和number99,聲明一個數組變量,如使用數字numbers[0], numbers[1], 和..., numbers[99]來表示各個變量。在數組中的特定元素是通過索引來訪問。
所有陣列組成的連續的存儲單元。最低的地址對應於所述第一元素,而最高地址的最後一個元素。
聲明數組:
在D編程語言聲明數組,程序員指定的元素和如下由陣列所需元素的數量的類型:
type arrayName [ arraySize ];
這就是所謂的單維數組。arraySize必須是整數常量大於零且類型可以是任何有效的D編程語言數據類型。例如,要聲明一個10個元素的數組為double類型,使用此語句:
double balance[10];
初始化數組:
可以初始化D編程語言的數組元素或者一個接一個,或使用一個單獨的語句如下:
double balance[5] = [1000.0, 2.0, 3.4, 17.0, 50.0];
方括號內[]的值的個數在右邊不能比,我們的聲明方括號[]之間的數組元素的個數較大。下麵是一個示例來指定數組的單個元素:
如果省略數組的大小,創建數組的大小剛好能容納初始化。因此,如果編寫:
double balance[] = [1000.0, 2.0, 3.4, 17.0, 50.0];
將創建完全相同的數組,和在前麵的例子中那樣。
balance[4] = 50.0;
上述聲明數組的值50.0在指定元素數第5位。與第四索引數組將是第五次,即最後一個元素,因為所有的數組都是讓 0作為他們的第一個元素,也被稱為基本索引的索引。以下是我們上麵討論的相同陣列的圖案表現出來:
訪問數組元素:
元素是由索引數組名訪問。這是通過將一個元素的索引數組的名稱之後方括號內進行。例如:
double salary = balance[9];
上麵的語句將第10元素從數組並賦值給變量salary。下麵是一個例子,這將使用所有上述三個概念即:聲明,賦值和訪問數組:
import std.stdio; void main() { int n[ 10 ]; // n is an array of 10 integers // initialize elements of array n to 0 for ( int i = 0; i < 10; i++ ) { n[ i ] = i + 100; // set element at location i to i + 100 } writeln("Element Value"); // output each array element's value for ( int j = 0; j < 10; j++ ) { writeln(j," ",n[j]); } }
讓我們編譯和運行上麵的程序,這將產生以下結果:
Element Value 0 100 1 101 2 102 3 103 4 104 5 105 6 106 7 107 8 108 9 109
靜態數組與動態數組
當在程序被寫入所指定的數組的長度,該陣列是一個靜態數組。當長度可以在程序的執行過程中發生變化,該陣列是一個動態數組。
定義動態數組不是定義固定長度的陣列,因為省略長度使得一個動態數組簡單:
int[] dynamicArray;
數組屬性
屬性 | 描述 |
---|---|
.init | 靜態數組返回一個數組字麵量的字麵即數組元素類型。初始化屬性中的每個元素。 |
.sizeof | 靜態數組返回數組的長度乘以每個數組元素的字節數,而動態數組返回動態數組的引用,在32位版本大小為8,在64位版本的大小為16。 |
.length | 靜態數組返回,而動態數組是用來獲取/設置數組中的元素個數數組中元素的個數。長度的類型為size_t。 |
.ptr | 返回一個指向數組的第一個元素。 |
.dup | 創建同樣大小的動態數組及數組中的內容複製到其中。 |
.idup | 創建同樣大小的動態數組及數組中的內容複製到其中。該副本的類型為是不可變的。 |
.reverse | 在當前位置倒轉數組中的元素的順序。返回數組。 |
.sort | 在這裡各種陣列中的元素的順序。返回數組。 |
下麵的例子說明可用於數組的各種屬性。
import std.stdio; void main() { int n[ 5 ]; // n is an array of 5 integers // initialize elements of array n to 0 for ( int i = 0; i < 5; i++ ) { n[ i ] = i + 100; // set element at location i to i + 100 } writeln("Initialized value:",n.init); writeln("Length: ",n.length); writeln("Size of: ",n.sizeof); writeln("Yiibaier:",n.ptr); writeln("Duplicate Array: ",n.dup); writeln("iDuplicate Array: ",n.idup); n = n.reverse.dup; writeln("Reversed Array: ",n); writeln("Sorted Array: ",n.sort); }
讓我們編譯和運行上麵的程序,這將產生以下結果:
Initialized value:[0, 0, 0, 0, 0] Length: 5 Size of: 20 Yiibaier:7FFF5A373920 Duplicate Array: [100, 101, 102, 103, 104] iDuplicate Array: [100, 101, 102, 103, 104] Reversed Array: [104, 103, 102, 101, 100] Sorted Array: [100, 101, 102, 103, 104]
多維數組
D編程允許多維數組。這裡是一個多維數組聲明的一般形式為:
type name[size1][size2]...[sizeN];
例如,下麵的聲明創建一個三維: 5 . 10 . 4整數數組:
int threedim[5][10][4];
二維數組:
多維數組的最簡單的形式是二維陣列。二維陣列在本質上是一維陣列的列表。聲明大小為x,y的二維整型數組,編寫如下:
type arrayName [ x ][ y ];
其中type可以是任何有效的D編程的數據類型和arrayName中會是一個有效的D編程標識符。
一個二維數組可以想作是一個表,有行和列:x行y列的數量,它包含三行四列可以如下所示:
因此,在數組每個元素是確定的形式的元素名為[i][j]時,其中a是數組的名稱,並且i和j是用來唯一地標識每一個元素的下標。
初始化二維數組:
多維陣列可以通過指定每一行括號內的值進行初始化。以下是3行,每行一個數組有4列。
int a[3][4] = [ [0, 1, 2, 3] , /* initializers for row indexed by 0 */ [4, 5, 6, 7] , /* initializers for row indexed by 1 */ [8, 9, 10, 11] /* initializers for row indexed by 2 */ ];
嵌套的括號,這表明預定的行,是可選的。下麵的初始化等同於前麵的例子:
int a[3][4] = [0,1,2,3,4,5,6,7,8,9,10,11];
訪問二維數組元素:
在2維數組的元素是通過使用下標,即行索引和所述陣列的列索引的訪問。例如:
int val = a[2][3];
上麵的語句將第4個元素的數組的第三排。可以在上麵雙字母組合驗證。
import std.stdio; void main () { // an array with 5 rows and 2 columns. int a[5][2] = [ [0,0], [1,2], [2,4], [3,6],[4,8]]; // output each array element's value for ( int i = 0; i < 5; i++ ) for ( int j = 0; j < 2; j++ ) { writeln( "a[" , i , "][" , j , "]: ",a[i][j]); } }
讓我們編譯和運行上麵的程序,這將產生以下結果:
a[0][0]: 0 a[0][1]: 0 a[1][0]: 1 a[1][1]: 2 a[2][0]: 2 a[2][1]: 4 a[3][0]: 3 a[3][1]: 6 a[4][0]: 4 a[4][1]: 8
常見的數組操作
數組分片
我們經常用一個數組的一部分,切片陣列往往是相當有用的。一個簡單的例子數組切片如下所示。
import std.stdio; void main () { // an array with 5 elements. double a[5] = [1000.0, 2.0, 3.4, 17.0, 50.0]; double[] b; b = a[1..3]; writeln(b); }
讓我們編譯和運行上麵的程序,這將產生以下結果:
[2, 3.4]
數組複製
我們還使用複製數組。一個簡單的例子,適用於陣列的複製如下所示。
import std.stdio; void main () { // an array with 5 elements. double a[5] = [1000.0, 2.0, 3.4, 17.0, 50.0]; double b[5]; writeln("Array a:",a); writeln("Array b:",b); b[] = a; // the 5 elements of a[5] are copied into b[5] writeln("Array b:",b); b[] = a[]; // the 5 elements of a[3] are copied into b[5] writeln("Array b:",b); b[1..2] = a[0..1]; // same as b[1] = a[0] writeln("Array b:",b); b[0..2] = a[1..3]; // same as b[0] = a[1], b[1] = a[2] writeln("Array b:",b); }
讓我們編譯和運行上麵的程序,這將產生以下結果:
Array a:[1000, 2, 3.4, 17, 50] Array b:[nan, nan, nan, nan, nan] Array b:[1000, 2, 3.4, 17, 50] Array b:[1000, 2, 3.4, 17, 50] Array b:[1000, 1000, 3.4, 17, 50] Array b:[2, 3.4, 3.4, 17, 50]
數組設定
一個簡單的例子數組中的設定值如下所示。
import std.stdio; void main () { // an array with 5 elements. double a[5]; a[] = 5; writeln("Array a:",a); }
當上麵的代碼被編譯並執行,它會產生以下結果:
Array a:[5, 5, 5, 5, 5]
數組連接
一個簡單的例子對兩個數組的並置如下所示。
import std.stdio; void main () { // an array with 5 elements. double a[5] = 5; double b[5] = 10; double [] c; c = a~b; writeln("Array c: ",c); }
讓我們編譯和運行上麵的程序,這將產生以下結果:
Array c: [5, 5, 5, 5, 5, 10, 10, 10, 10, 10]