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

news2025/6/13 1:25:48

最近新闻看到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

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

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

相关文章

HTML静态网页成品作业(HTML+CSS)—— 校园贷主题网页(2个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有2个页面。 二、作品演示 三、代…

理解Python的元类

1.type()函数 type 函数是一个内置函数,用来获取一个对象的类型。它可以接受一个参数,返回这个参数的数据类型。type也可以用来创建类,type就是元类 x333 list["ab"] tuple (1, "a", True, 3.14) dict {name: Alice,…

驱动开发(四):Linux内核中断

驱动开发系列文章: 驱动开发(一):驱动代码的基本框架 驱动开发(二):创建字符设备驱动 驱动开发(三):内核层控制硬件层 驱动开发(四&#xf…

JDK17 你的下一个白月光

JDK版本升级的非常快,现在已经到JDK20了。JDK版本虽多,但应用最广泛的还得是JDK8,正所谓“他发任他发,我用Java8”。 但实际情况却不是这样,越来越多的java工程师拥抱 JDK17,于是了解了一下 JDK17新语法&a…

浅谈TARA在汽车网络安全中的关键角色

随着现代汽车技术的迅猛发展,网络安全成为汽车行业一个不可忽视的领域。为了应对日益复杂的网络威胁,ISO/SAE 21434标准和UN R155法规提供了系统化的网络安全管理框架。其中,TARA(威胁分析与风险评估)作为核心方法论&a…

MGRS坐标

一 概述 MGRS坐标系统,即军事格网参考系统,是北约(NATO)军事组织使用的标准坐标系统。它基于UTM(通用横向墨卡托)系统,并将每个UTM区域进一步划分为100km100km的小方块。这些方块通过两个相连的字母标识,其…

从GAN到WGAN(02/2)

文章目录 一、说明二、GAN中的问题2.1 难以实现纳什均衡(Nash equilibrium)2.2 低维度支撑2.3 梯度消失2.4 模式坍缩2.5 缺乏适当的评估指标 三、改进的GAN训练四、瓦瑟斯坦(Wasserstein)WGAN4.1 什么是 Wasserstein 距离?4.2 为什么 Wassers…

AI大模型应用落地:AI+任何行业都是王炸

AI大模型物流:顺丰案例分享: 顺丰集团作为物流行业的领军企业,如何通过新质生产力的注入,重塑科技驱动的物流服务。 “天网”航空资源和“地网”地面运输网络一直是顺丰的两大优势,而多年来,通过在技术方…

除了程序员,你又是谁呢?别说!保护自己能量最好的方式——早读(逆天打工人爬取热门微信文章解读)

你很困的时候,会不会遵循本心直接睡觉呢? 引言Python 代码第一篇 洞见 保护自己能量最好的方式第二篇 视频新闻结尾 引言 现在真的是越来越遵循本心了 昨天晚上10点多 觉得好困 但是又没有洗澡 然后就想着算了 躺一个 没想到一躺 早上6点了 起来速速洗刷…

Scrum Day盛大启幕【限时优惠】

关于 Scrum Day 智驭未来,敏捷先行 —— 2024中国Scrum大会启航 在全球数字化转型的浪潮中,敏捷已成为企业脱颖而出的关键。 Scrum中文网携手全球敏捷行业巨擘 —— Scrum.org 联袂呈现年度敏捷盛会 Scrum Day,将于今秋盛大启幕&#xff01…

通过MATLAB实现PID控制器,积分分离控制器以及滑模控制器

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 通过MATLAB实现PID控制器,积分分离控制器以及滑模控制器。通过对比三个算法可知,采用滑模控制算法,其具有最快的收敛性能,较强的鲁棒性&…

普通LED显示屏与柔性LED显示屏如何选择?

在数字化时代的浪潮中,LED显示屏作为信息展示的重要媒介,其市场发展迅速,产品种类也日益丰富。面对普通LED显示屏与柔性LED显示屏两种选择,消费者和企业常常陷入纠结。那么,究竟该如何选择呢?让我们来深入探…

QUIC 和 TCP: 深入解析为什么 QUIC 更胜一筹

引言 在过去的三十年里,HTTP(超文本传输协议)一直是互联网的支柱。我们可以通过 HTTP 浏览网页、下载文件、流式传输电影等。这一协议随着时间的推移已经得到了重大改进。 HTTP 协议是一个应用层协议,它基于 TCP(传输…

手机IP地址距离多远会变:解析移动设备的网络定位奥秘

在移动互联网时代,手机IP地址扮演着至关重要的角色,它不仅是我们访问网络的基础,还常常与网络定位、地理位置服务等相关联。那么,手机IP地址在距离多远时会发生变化呢?手机IP地址距离多远会变?下面跟着虎观…

C# 中的日志记录技术详细解析与示例

文章目录 1. C# 日志记录的基本概念与重要性2. C# 中的日志记录主要方法使用 Console.WriteLine使用 System.Log* 类使用第三方日志库 3. 创建和配置日志记录器的基本步骤4. 不同情境下的日志记录应用示例示例 1:使用 Console.WriteLine示例 2:使用 Debu…

HTML静态网页成品作业(HTML+CSS+JS)——游戏天天酷跑网页(4个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,使用Javacsript代码实现图片切换轮播,共有4个页面。 二、…

【Ardiuno】使用ESP32单片机网络功能调用API接口(图文)

接着上文连通wifi后,我们通过使用HTTPClient库进行网络相关操作,这里我们通过http协议进行接口调用。 为了简化操作,小飞鱼这里使用了本地服务器上的文件作为接口,正常操作时会调用接口后,将服务器返回的数据进行解析…

AI办公自动化:批量在多个Word文档中插入对应图片

工作任务:文件夹中有多个word文档和word文档名称一致的图片,要把这些图片都插入到word文档中 在chatpgt中输入提示词: 你是一个Python编程专家,写一个Python脚本,具体步骤如下: 打开文件夹:F:…

php收银系统源码推荐

智慧新零售系统是一套线下线上一体化的收银系统。致力于给零售门店提供『多样化线下收银』、『ERP进销存』、『o2o小程序商城』、『精细化会员管理』、『丰富营销插件』等一体化行业解决方案! 一、多样化线下收银 1.聚合收款码 ①适用商户:小微门店&am…

哪里有海量的短视频素材,以及短视频制作教程?

在当下,短视频已成为最火爆的内容形式之一,尤其是在抖音上。但很多创作者都面临一个问题:视频素材从哪里来?怎么拍摄才能吸引更多观众?别担心,今天我将为大家推荐几个宝藏网站,确保你素材多到用…