我真的很难想出优化这段代码的方法。这能更有效率吗?
/**
@dev Utility function to remove a given address from a list of addresses
@param arr A list of addresses
@param token Address to remove
*/
function _remove(address[] storage arr, address token) internal {
uint len = arr.length;
for(uint i; i < len; ++i) {
if (arr[i] == token) {
arr[i] = arr[arr.length - 1];
arr.pop();
break;
}
}
}
```发布于 2022-10-10 16:58:54
发布于 2022-10-10 14:57:14
这种方法看起来非常好,而且效率很高,因为它似乎并不是您可以做的优化它的任何事情。
您需要从存储数组中移除元素,但首先,您需要找到它,您没有任何选择,只能先进行线性搜索才能找到它。您可能会变得更加复杂,并使用一个mapping来保存存储数组中每个token的索引,以便在下一次恒定时间内找到它,但是这会更复杂,而且仍然要花费一些。因此,您需要权衡您的选项,并计算,看看在您的情况下,采用另一种方法是否更有效。
否则,你的方法看上去是合理的。除非您实际上可以将tokens本身放入mapping中,所以如果您需要获取/删除它们,则可以在固定时间内完成。
还有一条建议:
arr[i] = arr[arr.length - 1];“移动”它,而只需弹出它。发布于 2022-10-10 20:11:49
我不确定这里的最终目标是什么。但是我确信for循环是一个99%的错误选择。
我强烈建议阅读可迭代映射。(如果您真的需要使用一个地址数组) https://medium.com/rayonprotocol/creating-a-smart-contract-having-iterab
https://ethereum.stackexchange.com/questions/137191
复制相似问题