Arrays
如何在 Solidity 中實現雙端隊列?
我有一個有限大小的數組,比如
uint[100] Arr;
.我的問題是,如果我想不斷推送到這個數組,如果它已經有 100 個 uint 而我推送另一個會發生什麼?我會崩潰嗎?還是會自動彈出第一個元素?
如果它沒有彈出第一個元素,我可以這樣做:
if (Arr.length == 100) { delete Arr[0]; } Arr.push(new_uint);
你不能
push
到一個固定大小的數組。(你上面寫的程式碼不會編譯。)
push
修改數組的大小,因此對於固定大小的數組來說這是一個沒有意義的操作。它只存在於動態數組中。更新
我相信這
delete Arr[0]
相當於Arr[0] = 0
,所以它也沒有為你做任何有用的事情。如果你解釋你想要做什麼,也許人們可以提供更多幫助。(看起來您正在嘗試使用固定大小的數組實現雙端隊列?但是當空間不足時應該發生什麼?)
更新 2
根據評論,聽起來您只需要一個正常的循環緩衝區。
未經測試,但我相信這應該有效:
pragma solidity ^0.4.17; contract CircularBuffer { uint[100] Arr; // Represents the index in the array of the oldest element uint8 start; // Represents the next position to write to uint8 end; // Represents the size of the data (max of 100) uint8 size; function append(uint value) public { Arr[end] = value; end = (end + 1) % 100; if (size < 100) { size += 1; } else { // start was just overwritten start = (start + 1) % 100; } } function enumerate() public { for (uint8 i = 0; i < size; i++) { uint value = Arr[(start + i) % 100]; // do something with value here } } }