链表简单实现:
头结点变量:list
插入操作:
list = {next = list,value = v}
集合的实现:
用集合的元素作为引用放入到table
基本结构:
local reserved = { ["white"] = true, ["red"] = true, ["function"] = true, }
if reserved["white"] then
--访问
end
完整过程:
local Set= {}
function Set:new(t)
local set = {}
for k,v in pairs(t) do
set[v] = (set[v] or 0) + 1
end
setmetatable(set, self)
self.__index = self
return set
end
function Set:insert(value)
self[value] = (self[value] or 0) + 1
end
function Set:remove(value)
local count = self[value]
self[value] = (count and count > 1) and count - 1 or nil
end
字符串缓冲:
逐行读取文件:
local buff=""
for line in io.lines() do
buff=buff..line.."\n"
end
假如buff目前已经存储了一个50kb的字符串,line每次读取大小为20字节。当执行代码buff=buff..line.."\n"时,就会创建50020字节的新字符串,并从buff中复制至少50kb到新的字符串。所以如此的话,没读取一行就会移动至少50KB的内存。在读取了100行(2KB的字符)时,就至少移动了5MB的内存,所以这种做法在读取较大文件是不可取的。
所以很多语言提供了StringBuffer来解决这个问题。
在lua中用table在做类似的事:
local t={}
for line in io.lines() do
if(line==nil) then break end
t[#t+1]=line
end
local s=table.concat(t,"\n") --将table t 中的字符串连接起来