Silk数组

数组是常用的数据结构,数组中的每个元素都可通过它的索引获取,索引从0开始。
Silk数组通过方括号定义,如果有初始化的元素,直接写在方括号内,用逗号隔开。
array=[];
array=[10,20,30];

访问数组内的元素通过索引获取:
print(array[1]);//获取数组里第二个元素,就是20

Silk数组内的元素可以混用任何Silk的数据类型:
array=[1,true,"good",null];
for(i=0;i<array.size();i++)
    print(array[i]);

甚至数组内可以嵌套包含数组或字典:
dict1={"name":"wang","age":10};
array1=["good","OK"];
array2=[1,true,"good",null,array1,dict1];
for(i=0;i<array2.size();i++)
    print(array2[i]);

甚至可以多重嵌套:
array1=["good","OK"];
array2=[1,true,"good",null,array1];
array3=[2,array1,array2,"hi"];
print(array3[2][4][0]);

也可以直接把数组或字典定义嵌套包含在数组里:
array2=[1,true,"good",null,["good","OK"],{"wang":30}];
for(i=0;i<array2.size();i++)
    print(array2[i]);

创建多维数组可以直接定义在方括号内:
arr=[[1,2,3],[4,5,6]];//创建2*3大小的二维数组
print(arr[1][1]);

也可以用下面的函数创建二维数组:
//创建N*M大小的二维数组
func create_2d_array(N,M,value=0)
{
    array=[];
    array.resize(N);
    for(i=0;i<N;i++)
    {
        array[i]=[];
        array[i].resize(M,value);
    }
    return array;
}

当然,最简单的方法是用数组的成员函数create2d和create3d直接创建二维和三维数组。

数组成员函数:

append()
 向数组尾部添加元素,数组大小也随之增加。
array=["good","OK"];
array.append("Great");
print(array[2]);
array.append(100.25);
print(array[3]);


size()
 获取数组大小,即数组内元素个数, 也可以通过内置函数_len(array)获取
print(array.size());


resize(count, value)
 重新定义数组大小,参数count为数组大小,value为数组中新元素的初值,可以忽略。
定义数组后,如果没有指定初始化元素,默认大小为0,如果想改变或重新定义大小,用resize()函数:
array=[];
array.resize(3);//重新定义数组大小为3,但3个元素没有初值,需要赋值。
array[0]=123;
array[1]="OK";
array[2]=32.12;
array2=[];
array2.resize(3,"ok");//重新定义数组大小为3,3个元素的初值都为"ok"。


clear()
 清空数组里的所有元素
array=["good","OK"];
array.clear();
print(array.size());


erase(pos)
 删除数组里位置pos上的元素
erase(pos,pos2)
 删除数组里从开始位置pos到结束位置pos2之间的元素,不包括pos2位置的元素
array=["good","OK",2,100,"fine"];
array.erase(1,3);
for(i=0;i<array.size();i++)
print(array[i]);


insert(pos,item)
 在数组里位置pos上插入一个元素item
array=["good","OK",2,100,"fine"];
array.insert(1,"new");
for(i=0;i<array.size();i++)
print(array[i]);


sort()
 对整个数组从小到大排序,如果数组里有不同的类型,将会按类型分组排序。
array=[23,44,24,221,32,4,56,63,3,3,45];
array.sort();
for(i=0;i<array.size();i++)
    print(array[i]);

排序结果:
3,3,4,23,24,32,44,45,56,63,221

array=[23,44,24,221,32,4,56,63,3,23.43,4.6,"qabc","bbc"];
array.sort();
for(i=0;i<array.size();i++)
    print(array[i]);

排序结果:
bbc,qabc,3,4,23,24,32,44,56,63,221,4.6,23.43
   

swap(array)
 和另外一个数组array交换内容,array必须也是数组:
main()
{
    a=[0,1,2];
    b=["a","b"];
    a.swap(b);
    print(a,b);
}
运行结果:
["a" , "b" ] [0 , 1 , 2 ]


create2d(n,m,value)create3d(n,m,k,value)
 create2d创建n*m大小的二维数组,数组的初始值用value填充,value可以省略。创建成功后原数组将成为二维数组。
 create3d创建n*m*k大小的三维数组,数组的初始值用value填充,value可以省略。创建成功后原数组将成为三维数组。

main()
{
    a=[];
    a.create2d(2,3,"ok");//在a上创建2*3大小的二维数组,初始值为"ok"
    print(a);

    b=[];
    b.create3d(2,3,2,0);//在b上创建2*3*2大小的三维数组,初始值为0
    print(b);
}
运行结果:
[["ok" , "ok" , "ok" ] , ["ok" , "ok" , "ok" ] ]
[[[0 , 0 ] , [0 , 0 ] , [0 , 0 ] ] , [[0 , 0 ] , [0 , 0 ] , [0 , 0 ] ] ]


_getptr()_restore(ptr)
_getptr()和_restore(ptr)用以解决对象的循环引用问题,具体请参考内存管理