Silk字典

字典是一种可存储任意键值对象的容器,每个键值对用冒号 : 分割,字典通过大括号定义,如果有初始化的键值对元素,直接写在大括号内,用逗号隔开。
dict={};
dict={1:"Gu"2:"Zhang","city":"Shanghai"};

方括号中放入相应的键就可以访问这个键的值:
print(dict[1]);
print(dict["city"]);

如果用字典里没有的键访问数据,会输出未定义(undefined)的错误。
print(dict["age"]);//undefined 

字典的键值可以混用任何Silk的数据类型,但键必须是唯一的,如果初始化时定义了重复的键,这个键对应的值为最后定义的键值对的值:
dict={"name":"Gu"2:"Zhang","3":true2:"good"};
print(dict[2]);//打印的结果为good

像数组一样,字典内可以嵌套包含数组或字典,键也可以是字典或数组:
array=["good","OK"];
dict={"name":"Wang""detail":array, "age":10, array:"OK","ID":[1,2,3]};
print(dict["detail"][0]);

访问键值对可以通过方括号内填入键值的方式:
print(dict["name"]);

遍历整个字典,字典内部键的存储方式是一种树形结构,不能像数组一样通过索引从小到大遍历,必须通过字典的成员函数begin, end, next, get 遍历访问:
dict={"name":"Wang""age":10"score":85.5};
for(i=dict.begin();!dict.end(i);dict.next(i))
    print(dict.get(i)[0],dict.get(i)[1]);

输出结果如下:
age 10
name Wang
score 85.500000
    
begin()返回指向字典第一个键值的游标(内部指针,类似迭代器),end(i)判断游标是否指向字典结尾,如果是返回1;next(i)让游标i移动到下一个键值
get(i)根据游标返回保存了键值对的数组(第一个元素为键,第二个元素为值)

字典成员函数

find(key)
 根据键查找字典中的键值对,返回键值对的值,如果没有找到,返回null;由于字典内部采用树形结构,所以查找很快,即使字典中包含大量数据。
dict={"name":"Wang""detail":array, "age":10};
value=dict.find("age");
print(value);

insert(key,value)
插入键值对,插入成功返回1,否则0;如果插入的键已经存在,则插入失败。
dict={"name":"Wang""age":10};
dict.insert("year",2020);
for(i=dict.begin();!dict.end(i);dict.next(i))
    print(dict.get(i)[0],dict.get(i)[1]);
也可以直接方括号内填入键值的方式插入键值对:
dict["year"]=2010;//这种方式如果键存在,则会用新的值覆盖原来的值,相当于更新值。而用insert插入则会失败。


clear()
 清空字典里的所有元素
dict={"name":"Wang""age":10};
dict.clear();


erase(key)
根据键删除字典中的键值对,删除成功返回1,否则0
erase(iter)
 根据游标删除字典中的键值对,删除后返回下一个游标,如果游标为反向游标,则返回上一个游标
dict={"name":"Wang""detail":array, "age":10, array:"OK"};
result=dict.erase("age");
for(i=dict.begin();!dict.end(i);dict.next(i))
    print(dict.get(i)[0],dict.get(i)[1]);


get(key)
根据键查找字典中的键值对并以数组形式返回,查找成功返回的数组第一个元素为键,第二个元素为值,如果没有找到则返回null
dict={"name":"Wang""detail":"a good man""age":20"phone":"13799999999"};
ret=dict.get("age");
if(ret)
    print(ret[0],"=",ret[1]);
get(iter)
 根据游标以数组形式返回键值对,返回的数组第一个元素为键,第二个元素为值,如果为非法游标则返回null 
dict={"name":"Wang""detail":"a good man""age":20"phone":"13799999999"};
for(iter=dict.begin();!dict.end(iter);dict.next(iter))
{
    ret=dict.get(iter);
    print(ret[0],"=",ret[1]);
}    

begin()
返回指向字典第一个键值的游标(内部指针,类似迭代器)。

end(iter)
判断游标是否指向字典结尾,如果是返回1,否则返回0。与begin和next配合正向遍历整个字典。

next(iter)
让游标iter移动到下一个键值。

rbegin()
返回指向字典最后一个键值的反向游标。

rend(iter)
判断反向游标是否指向字典开始处,如果是返回1,否则返回0。与rbegin和next配合反向遍历整个字典。

字典内部已经按照键从小到大排序,所以正向遍历是根据键从小到大遍历,反向遍历则是根据键从大到小遍历。

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