006 动态数组(lua)

文章目录

    • 初步准备
    • 实际应用

在Lua中,没有类的概念,因为它是基于原型的语言。不过,我们可以使用表(table)来模拟类和对象
Lua中的数组索引是从1开始的,而不是从0开始,
Lua的表是动态大小的,因此我们没有在Lua实现中强制数组的容量。
我们在Array.new函数中初始化了一个具有指定容量大小的数组,并且当尝试添加超过该容量的元素时,会抛出一个错误。在实际Lua使用中,通常不需要这样做,因为Lua表会自动扩展。此外,我们在移除元素时显式地将最后一个元素设置为nil,以避免潜在的内存泄漏,这是Lua中管理内存的一种好习惯。

初步准备

-- 这里创建了一个空表Array,它将被用作自定义数组类的原型。
-- __index元方法用于当访问表中不存在的字段时,Lua会调用这个元方法来查找值。
Array = {}  
Array.__index = Array  -- 构造函数
-- 这个函数是Array的构造函数,用于创建一个新的Array实例。
-- setmetatable函数设置了self的元表为Array,这样self就可以访问Array中定义的方法。function Array.new(capacity)  if capacity == nil then  capacity = 10  end  local self = {  data = {},  size = 0,  capacity = capacity  }  setmetatable(self, Array)  for i = 1, capacity do  self.data[i] = nil  end  return self  
end  -- 成员方法
-- 在Lua中,冒号:语法用于定义对象的方法
-- 这个方法返回数组的大小。self关键字代表调用该方法的对象实例。
function Array:getSize()  return self.size  
end  function Array:getCapacity()  return self.capacity  
end  function Array:isEmpty()  return self.size == 0  
end  function Array:addLast(e)  self:add(self.size + 1, e)  
end  function Array:addFirst(e)  self:add(1, e)  
end  function Array:add(index, e)  if self.size == self.capacity then  error("Add failed. Array is full.")  end  if index < 1 or index > self.size + 1 then  error("Add failed. Require index >= 1 and index <= size + 1.")  end  for i = self.size, index, -1 do  self.data[i + 1] = self.data[i]  end  self.data[index] = e  self.size = self.size + 1  
end  function Array:get(index)  if index < 1 or index > self.size then  error("Get failed. Index is illegal.")  end  return self.data[index]  
end  function Array:set(index, e)  if index < 1 or index > self.size then  error("Set failed. Index is illegal.")  end  self.data[index] = e  
end  function Array:contains(e)  for i = 1, self.size do  if self.data[i] == e then  return true  end  end  return false  
end  function Array:find(e)  for i = 1, self.size do  if self.data[i] == e then  return i  end  end  return -1  
end  function Array:remove(index)  if index < 1 or index > self.size then  error("Remove failed. Index is illegal.")  end  local ret = self.data[index]  for i = index, self.size - 1 do  self.data[i] = self.data[i + 1]  end  self.size = self.size - 1  self.data[self.size + 1] = nil  -- Explicitly nil the last element to avoid memory leak  return ret  
end  function Array:removeFirst()  return self:remove(1)  
end  function Array:removeLast()  return self:remove(self.size)  
end  function Array:removeElement(e)  local index = self:find(e)  if index ~= -1 then  self:remove(index)  end  
end  function Array:toString()  local res = "Array: size = " .. self.size .. ", capacity = " .. self.capacity .. "\n["  for i = 1, self.size do  res = res .. self.data[i]  if i ~= self.size then  res = res .. ", "  end  end  res = res .. "]"  return res  
end  -- Example usage:  
local arr = Array.new(5)  
arr:add(1, 10)  
arr:add(2, 20)  
arr:add(3, 30)  
print(arr:toString())  -- Output: Array: size = 3, capacity = 5 [10, 20, 30]

实际应用

由于Lua的表会自动进行扩展,我们不需要像在Java中那样显式地管理数组的容量。
在Lua中,我们通常使用ipairs来遍历数组部分(即,具有连续整数键的部分)的表。
由于Lua的表本身就是动态的,我们不需要像Java中那样处理数组的扩容。


Array = {}  
Array.__index = Array  function Array.new()  local self = {}  self.size = 0  self.data = {}  setmetatable(self, Array)  return self  
end  function Array:getSize()  return self.size  
end  function Array:isEmpty()  return self.size == 0  
end  function Array:addLast(e)  table.insert(self.data, e)  self.size = self.size + 1  
end  function Array:addFirst(e)  table.insert(self.data, 1, e)  self.size = self.size + 1  
end  function Array:add(index, e)  if index < 1 or index > self.size + 1 then  error("Add failed. Require index >= 1 and index <= size + 1.")  end  table.insert(self.data, index, e)  self.size = self.size + 1  
end  function Array:get(index)  if index < 1 or index > self.size then  error("Get failed. Index is illegal.")  end  return self.data[index]  
end  function Array:set(index, e)  if index < 1 or index > self.size then  error("Set failed. Index is illegal.")  end  self.data[index] = e  
end  function Array:contains(e)  for _, v in ipairs(self.data) do  if v == e then  return true  end  end  return false  
end  function Array:find(e)  for i, v in ipairs(self.data) do  if v == e then  return i  end  end  return -1  
end  function Array:remove(index)  if index < 1 or index > self.size then  error("Remove failed. Index is illegal.")  end  local ret = table.remove(self.data, index)  self.size = self.size - 1  return ret  
end  function Array:removeFirst()  return self:remove(1)  
end  function Array:removeLast()  return self:remove(self.size)  
end  function Array:removeElement(e)  local index = self:find(e)  if index ~= -1 then  self:remove(index)  end  
end  function Array:toString()  local res = "Array: size = " .. self.size .. "\n["  for i, v in ipairs(self.data) do  res = res .. v  if i ~= self.size then  res = res .. ", "  end  end  res = res .. "]"  return res  
end  -- Example usage:  
local arr = Array.new()  
arr:add(1, 10)  
arr:add(2, 20)  
arr:add(3, 30)  
print(arr:toString())  -- Output: Array: size = 3 [10, 20, 30]
Array = {}  
Array.__index = Array  function Array.new(capacity)  local self = {}  setmetatable(self, Array)  -- Initialize the array-like table  self.data = {}  self.size = 0  self.capacity = capacity or 10  return self  
end  function Array:getSize()  return self.size  
end  function Array:getCapacity()  return self.capacity  
end  function Array:isEmpty()  return self.size == 0  
end  function Array:addLast(element)  self:add(self.size + 1, element)  
end  function Array:addFirst(element)  table.insert(self.data, 1, element)  self.size = self.size + 1  -- Handle capacity increase if needed (omitted for simplicity)  
end  function Array:add(index, element)  if index < 1 or index > self.size + 1 then  error("Index out of bounds")  end  table.insert(self.data, index, element)  self.size = self.size + 1  -- Handle capacity increase if needed (omitted for simplicity)  
end  function Array:get(index)  if index < 1 or index > self.size then  error("Index out of bounds")  end  return self.data[index]  
end  function Array:set(index, element)  if index < 1 or index > self.size then  error("Index out of bounds")  end  self.data[index] = element  
end  function Array:remove(index)  if index < 1 or index > self.size then  error("Index out of bounds")  end  local element = table.remove(self.data, index)  self.size = self.size - 1  return element  
end  function Array:removeFirst()  return self:remove(1)  
end  function Array:removeLast()  return self:remove(self.size)  
end  function Array:toString()  local str = "Array: size = " .. self.size .. ", capacity = " .. self.capacity .. "\n["  for i = 1, self.size do  str = str .. tostring(self.data[i])  if i ~= self.size then  str = str .. ", "  end  end  str = str .. "]"  return str  
end  -- Usage example  
local arr = Array.new()  
arr:addLast(10)  
arr:addLast(20)  
arr:addFirst(5)  
print(arr:toString())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/36376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DigitalOcean 推出 Opensearch 托管服务,易用且强大的日志洞察与分析工具

DigitalOcean 宣布推出 DigitalOcean 的 Opensearch托管服务&#xff0c;这是一款专为深入的日志分析、简化故障排查和优化应用性能而设计的全面的解决方案。 简单介绍一下 Opensearch 这里先给不了解 Opensearch 的用户简单介绍一下。OpenSearch 是从 Elasticsearch 的一个相…

提升网络速度的几种有效方法

在数字化时代&#xff0c;网络速度对于我们的日常生活和工作至关重要。无论是观看高清视频、在线游戏&#xff0c;还是进行视频会议&#xff0c;快速稳定的网络连接都是不可或缺的。如果你发现自己当前的网络速度不尽如人意&#xff0c;那么不妨尝试以下几种方法来提升它。 升…

6.26.8 基于多视角深度卷积神经网络的高分辨率乳腺癌筛查

1. 介绍 1.1 乳腺癌筛查 开发了一种新的DCN&#xff0c;它能够处理乳房x线摄影筛查的多个视图&#xff0c;并利用大分辨率图像而不缩小。将这种DCN称为多视图深度卷积网络(MV-DCN)。网络学习预测放射科医生的评估&#xff0c;将传入的样本分类为BI-RADS 0(“不完整”)&#xf…

网络问题排障专题-AF网络问题排障

目录 一、数据交换基本原理 1、ARP协议工作原理 数据包如图&#xff1a; 2、二层交换工作原理 简述核心概念&#xff1a; 二层交换原理-VLAN标签 3、三层交换工作原理 二、AF各种部署模式数据转发流程 1、路由模式数据转发流程 三、分层/分组逐一案例讲解 1、问题现…

对于 PHP 开发的 Web 应用,怎样有效地防止 SQL 注入攻击?

防止 SQL 注入攻击是在 PHP 开发的 Web 应用中非常重要的安全措施之一。下面是一些有效的防止 SQL 注入攻击的方法&#xff1a; 使用参数化查询和预处理语句&#xff1a;使用参数化查询能够将用户输入的数据与 SQL 查询分离&#xff0c;从而避免 SQL 注入攻击。使用预处理语句可…

免费分享一套SpringBoot+Vue在线水果(销售)商城管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue在线水果(销售)商城管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue在线水果(销售)商城管理系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue在线水果(销售)商…

Android高级面试_8_热修补插件化等

Android 高级面试&#xff1a;插件化和热修复相关 1、dex 和 class 文件结构 class 是 JVM 可以执行的文件类型&#xff0c;由 javac 编译生成&#xff1b;dex 是 DVM 执行的文件类型&#xff0c;由 dx 编译生成。 class 文件结构的特点&#xff1a; 是一种 8 位二进制字节…

探索Facebook的未来世界:数字社交的演进之路

在数字化和全球化的浪潮中&#xff0c;社交网络如Facebook已经成为了人们日常生活不可或缺的一部分。然而&#xff0c;随着技术的迅猛发展和用户需求的不断变化&#xff0c;Facebook正在经历着社交平台的演进之路。本文将探索Facebook的未来世界&#xff0c;分析数字社交的发展…

CP AUTOSAR标准之KeyManager(AUTOSAR_CP_SWS_KeyManager)(更新中……)

1 简介和功能概述 该规范描述了AUTOSAR基础软件模块< KeyManager >的功能、API和配置。   AUTOSAR KeyM模块由两个子模块组成,即加密密钥子模块和证书子模块,如[1]“AUTOSAR对加密堆栈的要求”所要求。   加密密钥子模块提供API和配置项来引入或更新预定义的加密密…

技术选型新趋势:中小型企业如何选用高效CRM“小型应用”进行客户管理

众所周知&#xff0c;CRM应用通过优化客户信息管理、提升销售效率、提高客户服务质量、实现市场营销自动化以及支持数据分析与决策等方面&#xff0c;为企业创造更大的价值&#xff0c;提升企业的竞争力和市场份额。 对初创型、中小型企业来说&#xff0c;使用合适的CRM应用至…

【LLVM】学习使用PGO优化

笔者在查看PGO优化时看到了本站的这篇文章&#xff0c;其中代码和命令行部分贴上了序号&#xff0c;且命令行带上了$符号&#xff0c;不便于读者调试。 遂将代码重新整理到gitee&#xff0c;链接在此。 汇编代码分析 目前笔者使用的llvm版本为llvm-19&#xff0c;主要改动发生…

RK3588编译环境配置

安装Ubuntu18.04 安装Ubuntu请参考其他教程 安装vmware-tools 如果vmware版本过低&#xff0c;vmware-tools安装可能会出现各种问题。 建议直接用apt-get install安装vmware-tools sudo apt-get update sudo apt-get install open-vm-tools open-vm-tools-desktop vmware-…

选择印尼海外仓一件代发的攻略 - 广东智慧物流

选择印尼海外仓一件代发的攻略 - 广东智慧物流&#xff01; 你是不是也在为印尼跨境电商物流头疼&#xff1f;试试印尼海外仓一件代发吧&#xff01;&#x1f30f;&#x1f4e6; 攻略优势&#xff1a; 成本节约&#xff1a;不用设立当地仓库&#xff0c;省去高昂的员工费用&…

从CVPR 2024看域适应、域泛化最新研究进展

域适应和域泛化一直以来都是各大顶会的热门研究方向。 域适应指&#xff1a;当我们在源域上训练的模型需要在目标域应用时&#xff0c;如果两域数据分布差异太大&#xff0c;模型性能就有可能降低。这时可以利用目标域的无标签数据&#xff0c;通过设计特定方法减小域间差异&a…

C++生产者-消费者无锁缓冲区的简单实现

文章目录 1. 引言2. SPSC 环形缓冲区设计思想3. 缓冲区类定义4. 追加数据5. 读取数据6. 完整代码7. 基准测试7.1. 测试代码 8. 执行结果 1. 引言 本文将介绍如何实现无锁字节缓冲区&#xff08;LockFreeBytesBuffer&#xff09;&#xff0c;并通过Google Benchmark对其性能进行…

强化学习盾牌:scikit-learn模型正则化全面指南

&#x1f6e1;️ 强化学习盾牌&#xff1a;scikit-learn模型正则化全面指南 &#x1f6e1;️ 在机器学习中&#xff0c;模型正则化是一项关键技术&#xff0c;用于防止过拟合&#xff0c;提高模型的泛化能力。scikit-learn&#xff0c;作为Python中一个功能强大的机器学习库&a…

Flutter笔记(一)- 安装和配置Flutter

一、下载Flutter 访问网址&#xff1a;https://docs.flutter.dev/get-started/install?hlzh-cn 根据电脑所使用的操作系统的平台进行选择。笔者电脑的操作系统为Windows&#xff0c;因此选择如图1-1的Windows图片&#xff1a; 图1-1 Flutter网站&#xff08;一&#xff09; …

国行版苹果Vision Pro即将发售 高昂定价吓退普通消费者?

2024年2月2日&#xff0c;苹果第一代空间计算设备Vision Pro在美国上市。6月28日&#xff0c;国行版苹果Vision Pro也将正式发售&#xff0c;别为256GB版29999元、512GB版31499元、1TB版32999元。不过从此前Vision Pro预售情况来看&#xff0c;Vision Pro的“杀手锏”在“价格”…

【应届应知应会】Linux常用指令

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 本文封面由 凯楠&#x1f4f8;友情提供 目录 文件与目录管理 目录操作命令&#xff1a; ls [选项] [目录或文件] mkdir 文件操作命令&#xf…

多媒体本地化的五个步骤

多媒体本地化为试图在多个全球目的地建立市场的企业提供了许多好处。 由于多媒体并不局限于一个内容标签&#xff0c;因此您需要注意一些元素。 这个过程通常从翻译开始&#xff0c;但因为我们处理的是视频和音频&#xff0c;所以从一开始就要处理一个附加层。让我们从这里开…