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":true, 2:"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]);
访问键值对可以通过方括号内填入键值的方式:
遍历整个字典,字典内部键的存储方式是一种树形结构,不能像数组一样通过索引从小到大遍历,必须通过字典的成员函数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)用以解决对象的循环引用问题,具体请参考
内存管理。