Arrays

如何在 Solidity 中實現雙端隊列?

  • September 25, 2017

我有一個有限大小的數組,比如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
       }
   }
}

引用自:https://ethereum.stackexchange.com/questions/27026