4.1 数组分类
- 动态数组(可变长度数组)
// 动态数组
uint[] public nums = [1,2,3];
bytes public bs;
address[] public addrs;
- 定长数组
// 定长数组
uint[3] public nums3 = [1,2,3];
bytes[3] public bs4;
address[3] public addrs3;
4.2 数组操作
- length: 获取数组长度
- push() & push(x): 数组长度+1,push() 为添加元素默认值,push(x)为添加指定元素值
- delete: 数组长度不变,索引对应元素置为默认值
-
pop(): 数组元素-1,删除末尾元素
代码示例:
// 数组操作
function arrayOp() external returns (uint,uint,uint[] memory){
// 获取数组长度
uint a = nums.length;
uint b = nums3.length;
// push() & push(x)
nums.push(); // 数组长度增加1,push元素为uint默认值:[1,2,3] -> [1,2,3,0]
nums.push(5); // [1,2,3,0,5]
// delete
delete nums[1]; // [1,0,3,0,5]
// pop()
nums.pop(); // [1,0,3,0]
return (a,b,nums);
}
4.3 内存中的数组
- 内存中创建数组使用new关键字
- 必须指定数组长度(内存中创建的数组为定长数组)
示例代码:
// 内存中的数组
function arrInMemory() pure external returns (uint, uint[] memory) {
// 在内存中创建数组,使用new关键字,数组必须指定长度。(内存中的数组必须为定长数组)
uint[] memory a = new uint[](3);
// 内存中数组的相关操作
// 获取数组长度
uint l = a.length;
// 赋值
a[0] = 1;
a[1] = 2;
a[2] = 3;
// "删除元素"
delete a[1];
return (l,a);
}
4.4 数组元素删除
Solidity中delete方法只会将数组中的元素置为默认值,并不会将数组中的元素从数组中移出,即不会改变数组长度。如果想删除数组中的指定元素,根据业务需求不同,可以有移动数组元素和替换数组元素两种方法。
- 移动数组元素:适用于对数组元素顺序有要求的情况(不改变数组元素顺序,但是消耗较多gas fee)
// 删除数组元素--移动数组元素
function remove1(uint _index) external returns (uint[] memory) {
require(_index < nums.length, "index out if range");
for (uint i = _index;i < nums.length - 1;i++) {
nums[i] = nums[i+1];
}
nums.pop();
return nums;
}
- 替换数组元素:适用于对于数组元素顺序没有要求的情况(消耗较少gas fee,但是改变了数组元素顺序)
// 删除数组元素--替换数组元素
function remove2(uint _index) external returns (uint[] memory){
require(_index < nums.length, "index out if range");
nums[_index] = nums[nums.length - 1];
nums.pop();
return nums;
}
网友评论