当前位置: 首页 > news >正文

Zig标准库:最全数据结构深度解析(1)

最近新闻看到17岁中专女生拿下阿里全球数学竞赛第12名。咱们学习标准库中的数据结构是和学习数学是一脉相承的,结构体很多,也非常枯燥,但是不能全面解读过一遍,你很难写出合理的代码。所以,这一章节我们开始深度解析Zig中的数据结构,大家坐稳,让我们一起小跑前进。

1.1 ArrayList

Zig中广泛使用了std.ArrayList,它充当了一个可以动态改变大小的缓冲区。std.ArrayList(T)类似于C++中的std::vector和Rust中的Vecdeinit()方法会释放ArrayList的所有内存。我们可以通过其切片字段(.items)来读取和写入其中的数据。

接下来,我们将讲解测试分配器(std.testing.allocator)的使用方式。这是一种特殊的分配器,仅在测试环境中生效,并具备检测内存泄漏的功能。在实际编码过程中,请根据具体需求选择合适的分配器。

const std = @import("std");
const expect = std.testing.expect;const eql = std.mem.eql;
const ArrayList = std.ArrayList;
const test_allocator = std.testing.allocator;test "arraylist" {var list = ArrayList(u8).init(test_allocator);defer list.deinit();try list.append('H');try list.append('e');try list.append('l');try list.append('l');try list.append('o');try list.appendSlice(" World!");try expect(eql(u8, list.items, "Hello World!"));
}

1.2 BoundedArray

BoundedArray是一种结构,它包含一个固定大小的数组以及当前正在使用的长度。

它可以被用作一个变长数组,可以自由地调整大小至支持数组的最大尺寸。

如果你正在寻找Zig语言中类似于Rust超级实用的ArrayVec的等价物,这就是你想要的。

当需要传递那些确切大小仅在运行时才知悉,但最大尺寸在编译时已知的小型数组,并且无需分配器(Allocator)的情况下,使用有界数组是非常有用的。

相比于分别维护缓冲区和活动长度,或者涉及到包含指针的结构,有界数组使用起来更简便也更安全。

var actual_size = 32;
var a = try BoundedArray(u8, 64).init(actual_size);
var slice = a.slice(); // a slice of the 64-byte array
var a_clone = a; // creates a copy - the structure doesn't use any internal pointers

1.3 MultiArrayList

一个多维动态数组(MultiArrayList)存储一个结构体或带标签的联合体类型的列表。它不像普通的列表那样只存储单一的项目列表,而是为结构体的每个字段或联合体的标签和裸数据分别存储独立的列表。这种方式在结构体或联合体有填充(padding)的情况下可以节省内存,并且如果计算只需要某些字段或仅仅需要标签时,能够改善缓存的使用效率。访问字段的主要API是slice()函数,该函数计算出每个字段数组的起始指针。从slice结果中,你可以通过调用.items(.)来获取字段值的切片。对于联合体,你可以调用.items(.tags)或.items(.data)。

multi_array_list.zig代码解读icon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/multi_array_list.zig.html

1.4 ArrayHashMap 

一个具有默认哈希和等值函数的ArrayHashMap。有关哈希和等值实现的描述,请参阅AutoContext。

array_hash_map.zig - Zig standard libraryicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/array_hash_map.zig.html

1.5 BufMap

BufMap在键值对进入映射之前会复制它们,并在键值对被移除时释放它们。

buf_map.zig - Zig standard libraryicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/buf_map.zig.html

	
test "BufMap" {const allocator = std.testing.allocator;var bufmap = BufMap.init(allocator);defer bufmap.deinit();try bufmap.put("x", "1");try testing.expect(mem.eql(u8, bufmap.get("x").?, "1"));try testing.expect(1 == bufmap.count());try bufmap.put("x", "2");try testing.expect(mem.eql(u8, bufmap.get("x").?, "2"));try testing.expect(1 == bufmap.count());try bufmap.put("x", "3");try testing.expect(mem.eql(u8, bufmap.get("x").?, "3"));try testing.expect(1 == bufmap.count());bufmap.remove("x");try testing.expect(0 == bufmap.count());try bufmap.putMove(try allocator.dupe(u8, "k"), try allocator.dupe(u8, "v1"));try bufmap.putMove(try allocator.dupe(u8, "k"), try allocator.dupe(u8, "v2"));
}

1.6 BufSet

BufSet是一个字符串集合。在内部,BufSet会复制字符串,且永远不会接管传递给它的字符串的所有权。

https://ratfactor.com/zig/stdlib-browseable2/buf_set.zig.htmlicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/buf_set.zig.html

test "BufSet" {var bufset = BufSet.init(std.testing.allocator);defer bufset.deinit();try bufset.insert("x");try testing.expect(bufset.count() == 1);bufset.remove("x");try testing.expect(bufset.count() == 0);try bufset.insert("x");try bufset.insert("y");try bufset.insert("z");
}

 1.7 ComptimeStringMap

编译时优化的字符串映射,针对少量差异较大的字符串键集进行了优化。它的工作原理是在编译时按长度对键进行分类,而在运行时仅检查相同长度的字符串。

kvs_list期望一个由struct { []const u8, V }(键值对)元组组成的列表。如果你的V类型是void,那么你可以传递struct { []const u8 }(仅包含键)的元组。

test "ComptimeStringMap list literal of list literals" {const map = ComptimeStringMap(TestEnum, .{.{ "these", .D },.{ "have", .A },.{ "nothing", .B },.{ "incommon", .C },.{ "samelen", .E },});try testMap(map);
}

comptime_string_map.zig - Zig standard libraryicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/comptime_string_map.zig.html

1.8  Enum

这个模块包含了用于处理枚举(enums)的工具和数据结构。例子特别多,具体需要按需求自己 熟悉。

enums.zig - Zig standard libraryicon-default.png?t=N7T8https://ratfactor.com/zig/stdlib-browseable2/enums.zig.html

相关文章:

Zig标准库:最全数据结构深度解析(1)

最近新闻看到17岁中专女生拿下阿里全球数学竞赛第12名。咱们学习标准库中的数据结构是和学习数学是一脉相承的,结构体很多,也非常枯燥,但是不能全面解读过一遍,你很难写出合理的代码。所以,这一章节我们开始深度解析Zi…...

什么是 Linux From Scratch (LFS)?

Linux From Scratch (LFS) 是一个项目和一本书,指导用户从头开始构建自己的自定义Linux系统,而不是使用现成的Linux发行版。LFS项目由 Gerard Beekmans 在1999年创建,旨在帮助用户了解Linux的内部工作原理,并提供对系统的完全控制…...

常见的宽基指数基金

指数基金投资指南 ❝ 这篇博客里面的内容主要来自于银行螺丝钉的《定投十年,财务自由》和《指数基金投资指南》这两本书中章“常见的宽基指数”,最近第三次读这本书,打算做一点笔记加深自己的印象。 博客中很多内容是从书中摘抄的&#xff0c…...

Python学习笔记6:pychram相关知识及安装教程,后续需要学习的入门知识

上篇文章说了,今天去公司重新装一下IDE,最后也是把过程这边再记录一下,有需要的可以参考一下。 关于pychram pychram是什么? PyCharm是由JetBrains公司开发的一款流行的Python集成开发环境(IDE)。它专为…...

dockerfile文件的中的命令

# 基础镜像 FROM registry.cn-beijing.aliyuncs.com/205erp/myopenjdk:8.6 # 设置工作目录 WORKDIR /opt # 拷贝jar包到工作目录 COPY target/*.jar app.jar RUN ls # 设置暴漏的端口 EXPOSE 8080 # 启动jar包 CMD java ${JAVA_TOOL_OPTIONS} -jar app.jar...

【紫光同创盘古PGX-Nano教程】——(盘古PGX-Nano开发板/PG2L50H_MBG324第十一章)模拟波形实验例程说明

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com) 适用于板卡型号: 紫光同创PG2L50H_MBG324开发平台(盘古PGX-Nano) 一:…...

LUA移植到STM32F4,移植REPL,通过RTT Viewer交互

概述 站内移植LUA多数是使用C函数调用LUA,并没有移植REPL交互端口 本文将REPL也移植进去,做了简单的适配 LUA源码使用标准C库函数,如fgets,fwrite等,在嵌入式环境中要使用fgets,fwrite等C库函数&#xff…...

【GD32F303红枫派使用手册】第十九节

19.1 实验内容 通过本实验主要学习以下内容: SPI简介 GD32F303 SPI简介 SPI NOR FLASH——GD25Q32ESIGR简介 使用GD32F303 SPI接口实现对GD25Q32ESIGR的读写操作 19.2 实验原理 19.2.1 SPI简介 SPI(Serial Peripheral interface)&…...

【C语言】扫雷游戏

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…...

逻辑蕴含、函数依赖集的闭包、Armstrong公理、属性集闭包

一、引言 Armstrong公理-从给定的函数依赖集得到关系模式的完整依赖集 二、逻辑蕴含 1、定义 设F是关系模式R上的函数依赖集,X、Y是R的属性子集,对于R的每个满足F的关系实例r,若函数 依赖都成立,则称F逻辑蕴含。 记为&#…...

macOS聚集搜索功能开启与关闭

按下command空格弹出 使用搜索 关闭搜索 sudo mdutil -a -i off 启用搜索 sudo mdutil -a -i on...

大模型“诸神之战”,落地才是赛点

ChatGPT 诞生已经快一年,你还在与它对话吗? 有的人用来写报告、改代码,让它成为得力帮手;有的人却只是“调戏”个两三回,让它创作诗歌或故事,便不再“宠幸”。 根据网站分析工具 SimilarWeb 的数据&#…...

接口重放攻击

如何保证接口安全,做到防篡改防重放?_接口防止串改-CSDN博客 接口安全设计之防篡改和防重放_接口防篡改机制-CSDN博客 基于nonce timestamp 的方案 nonce的意思是仅一次有效的随机字符串,要求每次请求时该参数要保证不同。实际使用用户信息…...

MySQL学习笔记-进阶篇-SQL优化

SQL优化 插入数据 insert优化 1)批量插入 insert into tb_user values(1,Tom),(2,Cat),(3,Jerry); 2)手动提交事务 mysql 默认是自动提交事务,这样会导致频繁的开启和提交事务,影响性能 start transaction insert into tb_us…...

【机器学习】第2章 线性回归及最大熵模型

一、概念 1.回归就是用一条曲线对数据点进行拟合,该曲线称为最佳拟合曲线,这个拟合过程称为回归。 2.一个自变量 叫 一元线性回归,大于一个自变量 叫 多元线性回归。 (1)多元回归:两个x,一个…...

科技创新对农业发展的影响

科技创新对农业发展的影响深远且广泛,主要体现在以下几个方面: 一、提高农业生产效率 引入先进的农业机械设备:新型农业机械设备如无人机、机器人等的应用,显著减轻了农民的劳动强度,提高了农作物的种植效率。利用精…...

Linux 常用命令 - rm 【删除文件或目录】

简介 rm 命令源于英文单词 “remove”,它用于删除文件或目录。rm 是 Linux 系统中最基本的命令之一,用于删除指定的文件或目录。默认情况下,rm 不会删除目录,但可以通过递归删除选项来实现。 使用方式 rm [选项]... [文件]...常…...

一血c++

题目描述 每一个竞赛选手都无法拒绝拿一血 "一血"其实就是同学们在榜单上看到的深绿色的标记,代表着某道题目,他是第一个通过的。 叶苡朋老师是一名资深信奥选手,在大学多次获奖,也是一个资深抢一血爱好者&#xff0…...

无问芯穹Qllm-Eval:制作多模型、多参数、多维度的量化方案

前言 近年来,大语言模型(Large Models, LLMs)受到学术界和工业界的广泛关注,得益于其在各种语言生成任务上的出色表现,大语言模型推动了各种人工智能应用(例如ChatGPT、Copilot等)的发展。然而…...

2024-05-31T08:36:09.000+00:00 转换 YYYY-MM-DD HH-MM-SS

function formatDate(date) {// 处理ISO 8601字符串if (typeof date string) {date new Date(date);}// 处理时间戳else if (typeof date number) {date new Date(date * 1000); // 假设后端时间戳为秒,需要乘以1000转换为毫秒}// 自定义格式化,例如…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...