lua中table如何安全移除元素
在Lua中,table如何安全的移除元素这点挺重要,因为如果不小心,会没有正确的移除,造成内存泄漏。
引子
比如有些朋友常常这么做,大家看有啥问题
将test表中的偶数移除掉
local test = { 2, 3, 4, 8, 9, 100, 20, 13, 15, 7, 11}
for i, v in ipairs( test ) do
if v % 2 == 0 then
table.remove(test, i)
end
end
for i, v in ipairs( test ) do
print(i .. "====" .. v)
end
打印结果:
1====3
2====8
3====9
4====20
5====13
6====15
7====7
8====11
[Finished in 0.0s]
有问题吧,20怎么还在?这就是在遍历中删除导致的。
如何做呢?
Let's get started!
local test = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p' }
local remove = { a = true, b = true, c = true, e = true, f = true, p = true }
local function dump(table)
for k, v in pairs( table ) do
print(k)
print(v)
print("*********")
end
end
说明:一般我们不在循环中删除,在循环中删除会造成一些错误。这是可以建立一个remove表用来标记将要删除的,如上面例子,把将要删除的标记为true
方法1 从后往前删除
for i = #test, 1, -1 do
if remove[test[i]] then
table.remove(test, i)
end
end
dump(test)
为什么不从前往后,朋友们可以测试,table.remove操作后,后面的元素会往前移位,这时候后续的删除索引对应的元素已经不是之前的索引对应的元素了。
方法2 while删除
local i = 1
while i <= #test do
if remove[test[i]] then
table.remove(test, i)
else
i = i + 1
end
end
dump(test)
方法3 quick中提供的removeItem
function table.removeItem(list, item, removeAll)
local rmCount = 0
for i = 1, #list do
if list[i - rmCount] == item then
table.remove(list, i - rmCount)
if removeAll then
rmCount = rmCount + 1
else
break
end
end
end
end
for k, v in pairs( remove ) do
table.removeItem(test, k)
end
dump(test)
lua中table如何安全移除元素的更多相关文章
- lua中 table 元表中元方法的重构实现
转载请标明出处http://www.cnblogs.com/zblade/ lua作为游戏的热更新首选的脚本,其优势不再过多的赘述.今天,我主要写一下如何重写lua中的元方法,通过自己的重写来实现对l ...
- lua中 table 重构index/pairs元方法优化table内存占用
转载请标明出处http://www.cnblogs.com/zblade/ lua作为游戏的热更新首选的脚本,其优势不再过多的赘述.今天,我主要写一下如何重写lua中的元方法,通过自己的重写来实现对l ...
- lua中 table.getn(t) 、#t、 table.maxn(t) 这三个什么区别?
lua中 table.getn(t) .#t. table.maxn(t) 这三个什么区别? RTlocal t = {1,888,x= 999,b=2,5,nil,6,7,[10]=1,8,{z = ...
- Lua中table的实现-《Lua设计与实现》
本文来自<Lua设计与实现>的阅读笔记,推荐Lua学习者可以购买一本,深入浅出讲解lua的设计和实现原理,很赞,哈哈 Lua中对于表的设计,是基于数组和散列表,和其他语言不同,对于数组 ...
- lua中table的遍历,以及删除
Lua 内table遍历 在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: 1. ipairs for index, value in ipair ...
- 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串
最近在学习java,但是对于数据操作那部分还是不熟悉 因此决定找几个简单的算法写,用php和java分别实现 1.合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两 ...
- C++对Lua中table进行读取、修改和创建
C++代码: // LuaAndC.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #i ...
- Lua中Table的学习
--table 是 Lua 的一种数据结构,用来帮助我们创建不同的数据类型,如:数组.字典等 --Lua也是通过table来解决模块(module).包(package)和对象(Object)的. 例 ...
- lua中table的常用方法
转载:https://blog.csdn.net/Fenglele_Fans/article/details/83627021 1:table.sort() language = {"lua ...
随机推荐
- Linux常见的进程调度算法
进程调度:在操作系统中调度是指一种资源分配. 调度算法是指: 根据系统的资源分配策略所规定的资源分配算法. 操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源 ...
- (一)RocketMq入门之安装运行
一.几个重要的地址 Git地址:https://github.com/apache/incubator-rocketmq 编译好的文件:https://rocketmq.incubator.apach ...
- 机器学习(5): K-means 算法
3. K-means 算法: 3.1 Clustering 中的经典算法,数据挖掘十大经典算法之一 3.2 算法接受参数 k :然后将事先输入的n个数据对象划分为 k个聚类以便 ...
- Mac 开发者设置强迫症
Latest commit 2461787 on Mar 1 原文链接 强迫症的 Mac 设置指南 如何配置一个高效的 Mac 工作环境 English Version Table of Conten ...
- introduction to python for statistics,analysis笔记3
一.产生数组和矩阵 1.linspace(start,end,number),产生在start和end数之间number个数 >>> x = linspace(, , ) >& ...
- Android Studio项目迁移小结
近来试着使用Android Studio.确实有些功能远远甩开eclipse几条街,可是临时用起来还不够熟练,先对这两天做项目迁移的一点心得做点总结. 这里说的项目迁移,是指从eclipse环境下的项 ...
- Javascript玩转继承(一)
Javascript究竟是一门面向对象的语言,还是一门支持对象的语言,我想每个人都有着自己的看法.那些Javascript忠实的Fans一定讲Javascript是一门面向对象的语言,像<Jav ...
- sudo日志记录记录(rsyslog)
1,查软件 rpm -qa|egrep "sudo|rsyslog" 2,编辑sudoers echo "Defaults logfile=/var/log/sudo.l ...
- [sh]. 点的含义
. 的含义 当前目录 隐藏文件 任意一个字符 生效配置文件
- win常用
//base.Invoke((MethodInvoker)delegate() //{ // this.Close(); //});