Solidity
保留一組有限的地址(Solidity)
struct Data { ... } contract Court { mapping(address => Data) subcourts; }
我想跟踪這個映射的所有鍵的一個小的有限集(可以添加或刪除)。
更好的方法是什麼?
- 將地址數組作為新欄位
Court
;- 添加一個新
address
欄位來Data
製作一個鍊錶;- 添加兩個新
address
欄位以Data
創建雙向鍊錶。
假設順序無關緊要(由“集合”暗示),映射和數組的組合可以在恆定時間內處理集合操作。訣竅是跟踪數組中每個元素的位置,並將元素交換到末尾以進行刪除。我寫了一篇關於這種模式的部落格文章:https ://programtheblockchain.com/posts/2018/06/03/storage-patterns-set/ 。
這是該文章的完成程式碼:
pragma solidity ^0.4.24; contract Set { bytes32[] public items; // 1-based indexing into the array. 0 represents non-existence. mapping(bytes32 => uint256) indexOf; function add(bytes32 value) public { if (indexOf[value] == 0) { items.push(value); indexOf[value] = items.length; } } function remove(bytes32 value) public { uint256 index = indexOf[value]; require(index > 0); // move the last item into the index being vacated bytes32 lastValue = items[items.length - 1]; items[index - 1] = lastValue; // adjust for 1-based indexing indexOf[lastValue] = index; items.length -= 1; indexOf[value] = 0; } function contains(bytes32 value) public view returns (bool) { return indexOf[value] > 0; } function count() public view returns (uint256) { return items.length; } }