当前位置: 首页 > 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转换为毫秒}// 自定义格式化,例如…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

线程同步:确保多线程程序的安全与高效!

全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

dify打造数据可视化图表

一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

git: early EOF

macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...