Dプログラミング-配列
Dプログラミング言語は、という名前のデータ構造を提供します arrays、同じタイプの要素の固定サイズの順次コレクションを格納します。配列は、データのコレクションを格納するために使用されます。多くの場合、配列を同じ型の変数のコレクションと考える方が便利です。
number0、number1、...、number99などの個々の変数を宣言する代わりに、numbersなどの1つの配列変数を宣言し、numbers [0]、numbers [1]、...、numbers [99]を使用して表現します。個々の変数。配列内の特定の要素は、インデックスによってアクセスされます。
すべてのアレイは、連続したメモリ位置で構成されています。最小アドレスは最初の要素に対応し、最大アドレスは最後の要素に対応します。
配列の宣言
Dプログラミング言語で配列を宣言するために、プログラマーは次のように配列に必要な要素のタイプと要素の数を指定します。
type arrayName [ arraySize ];
これは、1次元配列と呼ばれます。ARRAYSIZEはゼロ以上の整数定数を大きくなければならないとタイプは任意の有効なDプログラミング言語のデータ型とすることができます。たとえば、double型のbalanceという10要素の配列を宣言するには、次のステートメントを使用します。
double balance[10];
配列の初期化
Dプログラミング言語の配列要素は、次のように1つずつ、または1つのステートメントを使用して初期化できます。
double balance[5] = [1000.0, 2.0, 3.4, 17.0, 50.0];
右側の角括弧[]の間の値の数は、角括弧[]の間の配列に対して宣言する要素の数より大きくすることはできません。次の例では、配列の1つの要素を割り当てます-
配列のサイズを省略すると、初期化を保持するのに十分な大きさの配列が作成されます。したがって、あなたが書く場合
double balance[] = [1000.0, 2.0, 3.4, 17.0, 50.0];
次に、前の例で行ったのとまったく同じ配列を作成します。
balance[4] = 50.0;
上記のステートメントは、配列の5番目の要素番号に50.0の値を割り当てます。4番目のインデックスを持つ配列は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 \t Value");
// output each array element's value
for ( int j = 0; j < 10; j++ ) {
writeln(j," \t ",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;
配列のプロパティ
配列のプロパティは次のとおりです-
シニア番号 | プロパティと説明 |
---|---|
1 |
.init 静的配列は、配列リテラルを返します。リテラルの各要素は、配列要素タイプの.initプロパティです。 |
2 |
.sizeof 静的配列は、配列の長さに配列要素ごとのバイト数を掛けたものを返しますが、動的配列は、動的配列参照のサイズを返します。これは、32ビットビルドでは8、64ビットビルドでは16です。 |
3 |
.length 静的配列は配列内の要素数を返し、動的配列は配列内の要素数を取得/設定するために使用されます。長さはsize_t型です。 |
4 |
.ptr 配列の最初の要素へのポインタを返します。 |
5 |
.dup 同じサイズの動的配列を作成し、配列の内容をその中にコピーします。 |
6 |
.idup 同じサイズの動的配列を作成し、配列の内容をその中にコピーします。コピーは不変として入力されます。 |
7 |
.reverse 配列内の要素の順序を逆にします。配列を返します。 |
8 |
.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("Pointer:",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
Pointer: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の多次元配列
Dプログラミングは多次元配列を可能にします。多次元配列宣言の一般的な形式は次のとおりです-
type name[size1][size2]...[sizeN];
例
次の宣言は、3次元の5を作成します。10。4整数配列-
int threedim[5][10][4];
Dの2次元配列
多次元配列の最も単純な形式は、2次元配列です。2次元配列は、本質的に1次元配列のリストです。サイズ[x、y]の2次元整数配列を宣言するには、次のように構文を記述します。
type arrayName [ x ][ y ];
どこ type 任意の有効なDプログラミングデータ型にすることができ、 arrayName 有効なDプログラミング識別子になります。
ここで、typeは任意の有効なDプログラミングデータ型であり、arrayNameは有効なDプログラミング識別子です。
2次元配列は、x個の行とy個の列を持つテーブルと考えることができます。2次元配列a 3行4列を含む以下のように表示できます-
したがって、配列内のすべての要素 a 要素によって次のように識別されます a[ i ][ j ]、 どこ a は配列の名前であり、 i そして j の各要素を一意に識別する添え字です。
2次元配列の初期化
多次元配列は、各行に括弧で囲まれた値を指定することで初期化できます。次の配列には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次元配列要素へのアクセス
2次元配列の要素には、配列の行インデックスと列インデックスを意味する添え字を使用してアクセスします。例えば
int val = a[2][3];
上記のステートメントは、配列の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
Dでの一般的な配列演算
配列に対して実行されるさまざまな操作は次のとおりです-
アレイスライシング
多くの場合、配列の一部を使用しますが、配列のスライスは非常に役立ちます。配列スライシングの簡単な例を以下に示します。
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]
配列の連結
2つの配列を連結する簡単な例を以下に示します。
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]