[Lua] 优化列表多元素删除
2018-10-25 23:46
375 查看
[Lua] 优化列表多元素删除
在 Lua 的内置库中,table 提供了 table.remove(t,[num]) 来删除列表中的元素,因为在该函数的执行过程涉及到了内存的移动,所以在删除多个元素的时候,如果每次都调用该函数,就会造成多次内存移动。
针对这一点,对 table 进行一些删除操作上的性能优化,代码基本上是从 C# 源码中抄过来的:-D,介绍在这里,下面直接附上代码,里面注释比较清楚,有什么问题,希望能够留言指出。
local TableUtil = {} ---从列表 t 中删除从 pos 开始的 num 个元素。 ---@t 删除元素的列表 ---@pos 开始删除索引 ---@num 要删除元素的数量,如果没有指定,则删除 pos 之后的所有元素 function TableUtil.ClearArray(t,pos,num) assert(t ~= nil,"The array:t is nil") assert(pos > 0 and pos<=#t,"The pos is out range") --如果没有指定 num 值,则默认 pos 之后全部删除 num = num or #t --需要删除的最后一个元素的索引 local index = 0 if num >= 0 then index = pos + num - 1 else --为了保持从尾往头删,调换头尾索引 pos,index = pos + num + 1,pos end --对头尾索引进行限制,避免超界 index = index > #t and #t or index index = index < 1 and 1 or index pos = pos < 1 and 1 or pos local maxn = #t - index + pos - 1 table.move(t,index+1,#t,pos) local temp = #t while temp > maxn do table.remove(t,temp) temp = temp - 1 end end ---从列表 t 中删除,所有满足 match 条件的元素 ---@t 列表 ---@match 筛选列表 function TableUtil.RemoveAll(t,match) assert(match ~= nil,"Then match argument cannot be nil") --找到第一个需要删除的元素的索引 num local num = 1 while(num < #t and not match(t[num])) do num = num + 1 end --如果需要删除的索引超过列表最大索引,则表明没有满足删除条件的元素 if num > #t then return 0 end --将 num 之后不需要删除的元素,移动到需要删除的元素之前,这样可以避免拷贝 local i = num + 1 while(i <= #t) do while(i <= #t and match(t[i])) do i = i + 1 end if i <= #t then t[num] = t[i] num = num + 1 i = i + 1 end end local result = #t - num + 1 --清楚需要删除的元素 ClearArray(t,num,result) return result end return TableUtil阅读更多
相关文章推荐
- Python 列表删除元素
- Python3列表元素的修改,添加( append(),inset() )和删除( del,pop(),remove() )操作
- R:增加或删除列表元素
- Python简单删除列表中相同元素的方法示例
- LintCode:删除列表中的元素
- Python3 利用函数 实现阶乘、列表中删除指定元素、等差数列求和
- jQuery根据元素值或元素下标来删除一个数组元素及数组对象方法列表
- Python实现删除列表中满足一定条件的元素示例(转)
- Python实现连接两个无规则列表后删除重复元素并升序排序的方法
- 为什么应尽量从列表的尾部进行元素的增加与删除操作?
- python-列表删除所有指定元素
- 【Python】给列表添加删除元素的方法
- LeetCode 从排序好的列表中删除重复元素
- [python]删除列表中相同的元素
- 使用Jquery随机删除一个顺序列表中某个子元素的方法,保持效果统一性
- Python学习记录02 列表添加和删除元素
- lua中删除元素
- 三种方法删除列表中重复的元素及效率分析!
- 452删除列表中的元素
- Python笔记——python 3.x中列表中元素删除del、remove、pop的用法及区别