05用d程式設計切片

2021-10-03 09:09:39 字數 3607 閱讀 5509

切片,動態陣列的別名.

[起..尾]是這樣的[..),即左包右不包

切片不是實體,就像鑰匙一樣.

如果切片修改實體,則實體也跟著變了.

[a..a],大小為0,[a..$],$表示陣列長度,等價於陣列.長度.

.dup複製實體.

如下:

import std.stdio;

void

main()

賦值:

int[3

] a =[1

,1,1

];int[

3] b =[2

,2,2

];a = b;

// a中都是2了,

writeln

(a);

靜態陣列的賦值必須長度一樣.長度屬於型別一部分,靜態陣列,賦值為實體.

靜態陣列都是實體.

賦值操作對切片完全不一樣,賦值是生成切片.切片的賦值則是切片.除非.dup.idup.

int

odds =[1

,3,5

,7,9

,11];

int[

] evens =[2

,4,6

,8,10

];int[

] slice;

//空的

slice = odds[2.

. $ -2]

;writeln

(slice)

; slice = evens[1.

. $ -1]

;writeln

(slice)

;

相當於說動態陣列有兩種含義:1動態陣列,2切片.

切片是間接的,類似於c++的串視,是一種檢視.儲存的是起始位置長度,而不是實體.修改實體,多個檢視都會變化.

import std.stdio;

void

main()

新增時,一旦沒有容納新元素的空間,則自動生成新實體,就單獨變化了.相當於寫時複製.

quarter ~=42

;//切片離開共享

quarter[1]

=0;//再修改,已經分家了,影響不了了

顯示增加切片的長度,也會生成新實體.

++quarter.length;

//或quarter.length +=5

;

各種方式縮短切片,則不會生成新的.

capacity,則強制規定切片大小,類似靜態陣列長度.只要陣列元素個數達到此,然後再增加時,就會生成新實體,為0時表明這不是最長的原始切片(實體),對這個切片新增新元素,導致重新生成新實體.

即用0與非0來區分是鑰匙還是實體.0則為鑰匙.為切片.非0則,本切片為實體.

if

(slice.capacity ==0)

else

特例是最開始幾個切片可能有相同大小容量,一旦改了乙個後,其餘的切片都變成鑰匙,都為0了,因為你不是實體,那個改了的切片才是實體.你鑰匙再變化一下,你就變成了新的實體.

為切片預留空間//附加元素成本很高:

import std.stdio;

void

main()

//超過31

}

對所有元素操作,對陣列(靜態/(動態/切片))都適用

import std.stdio;

void

main()

操作符可為:

算術操作+, -, 星號, /, %, 和 ^^;

二元操作符^, &, 和 |;

一元操作符-,~

賦值也可以:=, +=, -=, 星號=, /=, %=, ^^=, ^=, &=, 和 |=.

這項特徵,不僅用於兩項陣列,還可與陣列匹配的表示式連用.

double[3

] a =[10

,20,30

];a/

=4;writeln

(a);

//及 a=

42;//這是=操作符,每個元素都是42

writeln

(a);

小心區別:

slice2 = slice1;

//傳遞的是鑰匙

slice3[

]= slice1;

//=是操作符,兩邊都是切片,乙個個的賦值將1切片的值挨個的賦值給3切片.都是實體.

再看乙個,仔細觀察:

import std.stdio;

void

main()

危險是:改變值後才注意到可能的區別,即有兩種切片.一種是鑰匙,一種是實體.

多維陣列:

/* ... */ array =[[

10,11,

12],[

20,21,

22],[

30,31,

32],[

40,41,

42]];

array ~=[

50,51]

;//加元素

array[0]

~=13;

//加元素

//[[10, 11, 12, 13], [20, 21, 22], [30, 31, 32], [40, 41, 42], [50, 51]]

//固定陣列

int[2]

[3][

4] array;

建立切片的切片.

import std.stdio;

void

main()

d模板元程式設計筆記05

是 型別 可選 識別符號 是 型別 可選 識別符號 其他型別,可選 元 形參 列表 是 型別 可選 識別符號 其他型別,可選 元 形參 列表 是表示式,編譯時自省,是 檢查其為型別,則為真.元 可例項化用 別名 元名,型別.用模板完成,如果用函式名傳遞給元名,則不是有效型別,返回假,並置為空 有時,...

06用d程式設計 串

最簡單定義 char是串,字元陣列 d有三種陣列型別.import std.stdio void main 用 c z 可以看到結果,否則 回車 沒用.readf不適合讀串,讀符就差不多了.readln適合讀串,就不需要 s及 運算子了.如下 import std.stdio void main 可...

08用d程式設計域

不能在內部域中定義與外部域中相同的名字.有的在域的最前定義變數 一般在使用前定義變數,而不是在之後.找不到,也不規範 最好在剛要使用前定義,在速度,不犯錯,可讀,維護上都不錯.import std.stdio void main i 10 i 在 中宣告多種型別變數 d官方程式設計風格 三元符.三個...