D语言之数组

Wesley13
• 阅读 597

参考自d程序设计语言---我的博客http://my.oschina.net/u/218155/blog?fromerr=SwOkb7Sw fllow me

 在D语言中的数组是胖指针。 头指针+长度 或者头指针+尾指针 

在D语言中动态数组和静态数组会有一点不同。

定义一个动态数组

int[] arr = new int[10];
auto arr = new int[10];

动态数组的长度

arr.length

动态数组的复制,动态数组复制会引用同一副本,

auto arr2 = arr;
arr2[1] = 12;
assert(arr1[1] == 12);
assert(arr1 is arr2);//比较引用,指向同一副本
assert(arr1 == arr2);//比较内容

如果需要产生新的动态数组

auto arr3 = arr.dup;
assert(arr1 !is arr3);//arr1 和arr3不指向同一副本
assert(arr1 == arr3); //arr1 和arr3的值相同
arr3[1] = 13;
assert(arr1[1] != 13);

动态数组的分割,分割后的数组还是引用原数组的数据段,例如

auto arr4 = arr1[$/2 .. $];
arr4[0] = 1;
assert(arr4[0] == arr1[$/2]);

数组的拼接,数组拼接后会产生新的数组

int[] arr = [1,2,4];
int[] arr2 = arr ~ 11;
arr2[0] = 11;
assert(arr[0] != arr2[0]);

数组有个很重要的功能,支持表达式

   1 分割我们提过了 [m..n]

    2 ~连接, + - * 、 % ^ & ~ = += -= *= /= %= ^= &= |=

int[] arr = [1,2,4];
int[] arr2 = [13,23,43];
auto arr3 = new int[3];
arr3[] = arr[] + arr2[];
assert(arr3==[14,25,47]);

数组扩张和收缩

arr ~= 13;
arr.length = 100;
arr[1..$-1];

数组的循环

auto arr= [1,2,3];
foreach(v;arr) writeln(v);
//修改值
foreach(ref v:arr){
    v += 1;
}
assert(arr = [2,3,4]);

固定数组

int arr[3] = [1,2,3];
assert(arr.length == 3);

数组的边界检查,越界会报错,

D语言有三种模式@safe @system @trust。

通过模式可以设置是否报错 后面我们单独讨论他们。

静态数组分割会产生动态数组

int[] arr2 = arr[1..2];

静态数组的复制和动态数组不同,他们的复制会产生不同的副本

int arr[3] = [1,2,3];
int arr2[3] = arr3;
assert(arr !is arr2);

静态数组的拼接会产生静态数组

int arr[3] = [1,2,3];
int arr2[4] = arr ~ 12; 
int arr3[] = arr2 ~ 13;

多维数组,和其他语言没什么不同的,不再赘述。

关联数组

int[string] arr  = ["a":1,"b":2];//定义
assert(arr.length);//长度
arr["k"] = 3;//赋值
assert(arr.get("adb",13)== 13);//读取
assert(arr==["a":1,"b":2,"k":3]);
arr.remove("k");//移除
//通过foreach 迭代
foreach(k,v;arr){
    write(k,"=>",v,"\t");
}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
翼
3年前
js 数组 转为树形结构
需要转换为树形的数组vardata{"orderById":null,"platformCommissionProportion":1,"name":"添加剂","pid":13,"id":26
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Kevin501 Kevin501
3年前
Go语言中new()和make()的区别
1.Go语言中的值类型和引用类型值类型:int,float,bool,string,struct和数组(数组要特别注意,别搞混了)变量直接存储值,分配栈区的内存空间,这些变量所占据的空间在函数被调用完后会自动释放。引用类型:slice,map,chan和值类型对应的指针变量存储的是一个地址(或者理解为指针),指针指向内存中真
Stella981 Stella981
2年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Wesley13 Wesley13
2年前
Java开发者容易犯的十个错误
!(https://oscimg.oschina.net/oscnet/c9f00cc918684fbe8a865119d104090b.gif)Top1.数组转换为数组列表将数组转换为数组列表,开发者经常会这样做:\java\List<StringlistArrays.asList(arr);Arr
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
d语言
\我的博客http://my.oschina.net/u/218155/blog?fromerrSwOkb7Sw(http://my.oschina.net/u/218155/blog?fromerrSwOkb7Sw)fllowmestd.net.curld语言的网路curl库,提供更高级的服务。依赖libcurl。\
Wesley13 Wesley13
2年前
d语言之模块化
d语言之模块化参考自d程序设计语言我的博客http://my.oschina.net/u/218155/blog?fromerrSwOkb7Sw(http://my.oschina.net/u/218155/blog?fromerrSwOkb7Sw)fllowmemodule chapter11.test;impo