容器类型(array, map)
array表示数组,顺序存储一系列数值,map表示一种映射关系,他们的存储内存也都是动态分配的。
array
array 数组和 buffer 有点类似,都是可以顺序存储数据类型的数据。 但 buffer 和 array有以下区别:buffer 仅支持 0 ~ 255 的 int 数据作为成员数据, 而 array 不仅可以放 int, float 这些基本数据类型, 还可以存放 string,array,map,buffer等等任意 mixed 数据类型。
array类型基本语法如下:
array array_name = [ value1, value2, value3, ... ]; // value可以为任意不同类型的数值
array初始化,以及一些简单的符号运算:
array arr = [ 1, 2, nil, "Three", 2, [ "hello", (buffer)1, 3.14 ] ]; // 初始化arr
array arr1 = [1, 2], arr2 = [3, 4];
array add_arr = arr1 + arr2; // add_arr = [1, 2, 3, 4]
add_arr << ["hello"]; // add_arr = [1, 2, 3, 4, "hello"]
write(add_arr[0]); // 输出 1
array特殊语法
-
array_instance[<n] 获取数组倒数第n个元素
-
array_instance[m..n] 获取第m个元素到第n个元素构成的子数组
-
array_instance[m..<n] 获取第m个元素到倒数n个元素构成的子数组
-
array_instance[<m..<n] 获取倒数第m个元素到倒数n个元素构成的子数组
样例:
array test_arr = [1,2,3,4,5]; // 初始化arr
write(test_arr[<1], "\n"); // 输出 5
write(test_arr[<2], "\n"); // 输出 4
write(test_arr[1..<2], "\n"); // 输出 [2,3,4]
write(test_arr[1..2], "\n"); // 输出 [2,3]
write(test_arr[<3..<1], "\n"); // 输出 [3,4,5]
array常用的外部函数
下面列出array类型一些常用的外部函数以及用法。
1. 分配空间
函数原型:
array array.allocate(int size, mixed val = nil)
使用方法:
array arr = array.allocate(6); // arr.length() = 6
2. 清除空值
函数原型:
array array_instance.clean_up()
使用方法:
array arr = [1, 2, nil, "Three", 4]; arr.clean_up(); // arr.length() = 4
3. 清除空间
函数原型:
void array_instance.clear()
使用方法:
array arr = [1, 2, nil, "Three", 4]; arr.clear(); // arr.length() = 0
4. 删除一个值
函数原型:
int array_instance.delete(mixed val)
使用方法:
array arr = [1, 2, nil, "Three", 2]; int index = arr.delete(2); // index = 1
5. 删除n个值
函数原型:
void array_instance.delete_at(int pos, int num = 1)
使用方法:
array arr = [1, 2, nil, "Three", 2]; arr.delete_at(2, 2); // arr = [1, 2, 2]
6. 查找,失败-1
函数原型:
int array_instance.find(mixed val)
使用方法:
array arr = [1, 2, nil, "Three", 2]; int index = arr.find(2); // index = 1
7. 取值
函数原型:
mixed array_instance.get(int pos)
使用方法:
array arr = [1, 2, nil, "Three", 2]; mixed val = arr.get(1); // val = 2
8. 取子array
函数原型:
array array_instance.get_range(int pos, int count = -1)
使用方法:
array arr = [1, 2, nil, "Three", 2]; array child = arr.get_range(2,2); // child = [nil, "Three", 2]
9. 插入
函数原型:
void array_instance.insert(int pos, mixed val)
使用方法:
array arr = [1, 2, nil, "Three", 2]; arr.insert(1,"One"); // arr = [1, "one", 2, nil, "Three", 2]
10. 插入数组
函数原型:
void array_instance.insert_n(int pos, array val)
使用方法:
array arr = [1, 2, nil, "Three", 2]; array a = [3, 4]; arr.insert_n(1,a); // arr = [1, 3, 4, 2, nil, "Three", 2]
11. 小于val的元素个数
函数原型:
int array_instance.lower_bound(mixed val)
使用方法:
array arr = [1, 3, 5, 6.5, 7, 9]; int num = arr.lower_bound(6.5); // num = 3 (数组元素需要有序,二分查找)
12. 大等于val的元素个数
函数原型:
int array_instance.upper_bound(mixed val)
使用方法:
array arr = [1, 3, 5, 6.5, 7, 9]; int num = arr.upper_bound(6.5); // num = 4
13. 取值
函数原型:
mixed array_instance.get(int pos)
使用方法:
array arr = [1, 2, nil, "Three", 2]; mixed val = arr.get(1); // val = 2
14. 往后插入
函数原型:
void array_instance.push_back(mixed val)
使用方法:
array arr = [1, 2, nil, "Three", 2];
arr.push_back("!"); // arr = [1, 2, nil, "Three", 2, "!"]
15. 往后插入数组
函数原型:
void array_instance.push_back_n(array val)
使用方法:
array arr = [1, 2, nil, "Three", 2];
array a = [3, 4]; arr.push_back_n(a); // arr = [1, 2, nil, "Three", 2, 3, 4]
16. 赋值
函数原型:
void array_instance.set(int pos, mixed val)
使用方法:
array arr = [1, 2, nil, "Three", 2];
arr.set(2,"2"); // arr = [1, 2, "2", "Three", 2]
17. 复制
函数原型:
void array.copy(array dst, int pos, array src, int start = 0, int copy_len = 2^63 - 1)
使用方法:
array arr = [1, 2, 3];
array arr1 = array.allocate(3);
array.copy(arr1, 0, arr);// arr1 = [1, 2, 3]
18. array转字符串
函数原型:
string array_instance.implode(string delim = "")
使用方法:
array arr = ["hello", "world"];
string str = arr.implode(" "); // str = "hello world"
19. 排序
函数原型:
array array_instance.sort(int order = SortType.ASCENDING)
使用方法:
array arr = [7, 3, (buffer)1, "str"];
arr = arr.sort(SortType.ASCENDING); //arr [3, 7, "str", (buffer)1])
20. 函数排序
函数原型:
array array_instance.sort(function func, int order = ASCENDING)
使用方法:
//
21. 是否为array
函数原型:
bool is_array(mixed val)
使用方法:
array arr = [1, 2, nil, "Three", 2];
bool flag = is_array(arr); // flag = true
22. array映射
函数原型:
array array.map(array arr, function func)
使用方法:
array arr = [111, "222", [1, 2]];
array arrs = arr.map((: lengthof :)); // arrs = [0, 3, 2]
23. 范围数组
函数原型:
array array.range(int start, int end)
使用方法:
array arr = ["hello", "world", 1, 3];
array arr1 = array.range(2, 4); // arr1 = [2, 3, 4]
24. array转string
函数原型:
array array_instance.to_string()
使用方法:
array arr = ["hello", "world", 1, 3];
string str = arr.to_string(); // str = "["hello","world",1,3]"
25. 筛选新array
函数原型:
array array_instance.filter(function fun)
使用方法:
array arr=[4, 6, 8];
array arr1 = arr.filter((mixed val){ return val > 5;}); // arr1 = [6, 8]
26. 筛选第一个满足条件的value
函数原型:
mixed array_instance.select_first(function fun)
使用方法:
用法与filter()类似
27. 从左压缩数组
函数原型:
mixed array_instance.reduce_left(function fun)
使用方法:
array arr = [1, 2, 3];
int val = arr.reduce_left((int val1, int val2){return val1 + val2}); // val = 6;
28. 从右压缩数组
函数原型:
mixed array_instance.reduce_right(function fun)
使用方法:
用法与reduce_left()类似
map
map可以理解为一种类似于函数的映射(key -> value),其中key和value都可以是任意mixed类型的数值。
map类型基本语法如下:
map map_name = { key1:value1, key2:value2, key3:value3, ... }; // key和value可以为任意不同类型的数值
map初始化,以及一些简单的符号运算:
map m = {1:2, nil:"Three", "arr":[1, 2]}; // 初始化m
map m1 = {1:2, 3:5}, m2 = {3:4};
map add_map = m1 + m2; // add_map = {1:2, 3:4}, 覆盖m1中相同的key
write(add_map[1]); // 输出 2
map常用的外部函数
下面列出map类型一些常用的外部函数以及用法
1. values相加
函数原型:
mixed map.add_values(map m1, map m2)
使用方法:
map m1 = {1:2, 3:5}, m2 = {1:2.3, 3:4};
map m = map.add_values(m1, m2); // m = {1:4.3, 3:9}
2. 分配空间
函数原型:
map map.allocate(int size)
使用方法:
map m = map.allocate(6); // 注意:m.size() = 0
3. 删除无用值
函数原型:
map map_instance.clean_up()
使用方法:
map m = {1:2, nil:4, "hello":nil};
m = m.clean_up(); // m = {1:2, nil:4}
4. 清除map
函数原型:
void map_instance.clear()
使用方法:
map m = {1:2, nil:4, "hello":nil};
m.clear(); // m = {}
5. 删除key对应值(成功true)
函数原型:
int map_instance.delete(mixed key)
使用方法:
map m = {1:2, nil:4, "hello":nil};
int val = m.delete(1); // val = true
6. 删除value对应值
函数原型:
int map_instance.delete_value(mixed val)
使用方法:
map m = {1:2, nil:4, "hello":2};
int val = m.delete_value(2); // val = 2 (val为删除的数量)
7. 取key对应value
函数原型:
mixed map_instance.get(mixed key)
使用方法:
map m = {1:2, nil:4, "hello":nil};
mixed val = m.get(1); // val = 2
8. 取出所有key
函数原型:
array map_instance.keys()
使用方法:
map m = {1:2, nil:4, "hello":nil};
array keys = m.keys(); // keys = [1, nil, "hello"]
9. 设置key-value
函数原型:
void map_instance.set(mixed key, mixed val)
使用方法:
map m = {1:2, nil:4, "hello":nil};
m.set(nil, "hello"); // m = {1:2, nil:"hello", "hello":nil}
10. 取出所有value
函数原型:
array map_instance.values()
使用方法:
map m = {1:2, nil:4, "hello":nil};
array values = m.values(); // values = [2, 4, nil]
11. 是否为map
函数原型:
bool is_mapping(mixed val)
使用方法:
map m = {1:2, nil:4, "hello":nil};
bool flag = is_map(m); // flag = true
12. 是否包含key
函数原型:
bool map_instance.contains_key(mixed key)
使用方法:
map m = {1:2, nil:4, "hello":nil};
bool flag = m.contains_key(1); // flag = true
13. map转string
函数原型:
string map_instance.to_string()
使用方法:
map m = {1:2, nil:4};
string str = m.to_string(); // str = "{1:2,nil:4}"
14. map生成新map
函数原型:
string map_instance.map(function func)
使用方法:
map m = {"a": 2, "b": 3};
map m1 = m.map((int val, string key){ return val + 1;}); // m1 = {"a": 3, "b": 4}
15. 找第一个满足条件的value
函数原型:
mixed map_instance.select_first_key(function func)
使用方法:
map m = {"a": 2, "b": 6, "c": 7};
mixed m1 = m.select_first_key((int val, string key){ return val > 5;}); // m1 = "b"
16. 找第一个满足条件的key
函数原型:
mixed map_instance.select_first_value(function func)
使用方法:
// 用法与select_first_key()类似
17. 设置path-value
函数原型:
mixed map_instance.express_set(string path, mixed val)
使用方法:
map m = { };
m.express_set("a/b", 1); // m = {a: {b: 1}}
18. 增加path对应value
函数原型:
mixed map_instance.express_add(string path, mixed val)
使用方法:
m.express_add("a/b", 2); // m = {a: {b: 3}}
19. 查询path对应value
函数原型:
mixed map_instance.express_query(string path)
使用方法:
int val = m.express_query("a/b"); //val = 3
20. 删除path对应value
函数原型:
mixed map_instance.express_delete(string path)
使用方法:
m.express_delete("a/b"); // m = { }
注意
第14项新map的new_pair = [old_pair.key, (*func)(old_pair.value, old_pair.key)]