この第1版は、Lua 5.0用に書かれました。後のバージョンでは大まかに関連しているものの、いくつかの違いがあります。
第4版は Lua 5.3 を対象にしており、Amazon やその他の書店から入手できます。
この本を購入することで、Lua プロジェクトのサポートにも役立ちます。
![]() |
でプログラミングLua | ![]() |
パートII. テーブルとオブジェクト 第11章. データ構造 |
insert
と remove
(table
ライブラリから) を使用してキューを簡単に実装できますが、この実装は、構造が大きい場合にはあまりにも遅くなる可能性があります。より効率的な実装には、先頭要素と最後尾要素の2つのインデックスを使用します。
function ListNew () return {first = 0, last = -1} endグローバル空間の汚染を避けるために、リストのすべての操作をテーブル内に定義します。適切には
List
と呼ばれます。そのため、最後の例を以下のように書き直します。List = {} function List.new () return {first = 0, last = -1} end今や、両方の端に要素を挿入または削除して一定時間でできます。
function List.pushleft (list, value) local first = list.first - 1 list.first = first list[first] = value end function List.pushright (list, value) local last = list.last + 1 list.last = last list[last] = value end function List.popleft (list) local first = list.first if first > list.last then error("list is empty") end local value = list[first] list[first] = nil -- to allow garbage collection list.first = first + 1 return value end function List.popright (list) local last = list.last if list.first > last then error("list is empty") end local value = list[last] list[last] = nil -- to allow garbage collection list.last = last - 1 return value end
この構造を厳密なキュー規律で使用して、pushright
と popleft
のみを呼び出すと、first
と last
は継続的に増加します。しかし、Luaの配列はテーブルで表現されるため、それらを1から20、あるいは16,777,216から16,777,236でインデックスできます。さらに、Luaは倍精度で数を表現するため、プログラムは200年間実行されて毎秒100万回挿入を行った後でも、オーバーフローの問題は発生しません。
2003–2004 Roberto Ierusalimschyの著作権所有。すべての権利は留保されています。 | ![]() |