// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
//数组的控制,这次的需求是因为solidity DELET函数只能将数组中的值变成0 而不能真正删除,想要真正删除应该怎么做呢?
contract arrdeletFun {
uint[] public arr;
//定义一个函数去调用一个封装好的删除方法
function test() external {
arr \= [1,2,3,4,5];
//自定义的删除方法
deleteForArrIndex(1);
//断言检测
assert(arr[0] \== 2);
assert(arr[1] \== 3);
assert(arr[2] \== 4);
assert(arr[3] \== 5);
assert(arr.length \== 4);
}
//查看执行结果
function test2() public view returns (uint[] memory ) {
return arr;
}
//自定义删除方法
function deleteForArrIndex(uint index) public {
//首先,开发思路,我们拿到一个数组,可以用的方法只有pop是真正的改变长度移除
//如何改变数组呢?
//[1,2,3] 假如删除下标为1 的元素,得到的结果应该是[1,3]
//根据这个结果,反推,我们只能用pop但是pop直接使用结果是[1,2]
//再想想,假如改成[1,3,3]呢?
//相当于把下标1加上1个下标,以当前1下标开始之后的往前移动一位。
//则是 [1(下标0),2(下标1),3(下标2)],[1(下标0),3(下标1+1,也就是原数组下标2的值覆盖给当前下标),3(下标2+1,也就是原数组下标3的值附加给当前下标。但是原数组不存在下标3,所以结果会变成1.3.3)]
//这个功能我们可以使用for循环条件来操作每一个元素,根据上面的规则
//首先,检测传递过来的参数不能超过数组的长度
require(index < arr.length,"index max full");
for (uint i \= index; i < arr.length - 1;i++){
//然后,根据这个规则,我们来进行元素的移动
arr[i] \= arr[i+1];
}
arr.pop();
}
}
