Erlang中常用数据结构原理及其实现

文章目录

    • 一、Erlang 简介
    • 二、数据结构
      • 2.1、元组(Tuple)
        • 2.1.1、示例:
        • 2.1.2、实现:
      • 2.2、列表(List)
        • 2.2.1、示例
        • 2.2.2、实现
        • 2.2.3、原理
      • 3. 字典(Dictionary)
        • 3.1、创建字典
        • 3.2、添加和删除键值对
        • 3.3、获取值
        • 3.4、检查键是否存在
        • 3.5、获取字典大小
        • 3.6、遍历字典
        • 3.7、合并字典
        • 3.8、获取所有键
        • 3.9、获取所有值
      • 4. 集合(Set)
        • 4.1、创建集合
        • 4.2、添加元素
        • 4.3、删除元素
        • 4.4、判断元素是否存在
        • 4.5、获取集合大小
        • 4.5、并集
        • 4.6、交集
        • 4.7、差集
        • 4.8、遍历集合
      • 结论


一、Erlang 简介

Erlang 是一种函数式编程语言,它具有强大的并发和分布式编程能力。在 Erlang 中,常用的数据结构包括元组(tuple)、列表(list)、字典(dictionary)和集合(set)。这些数据结构在 Erlang 中被广泛应用于不同的场景中,例如存储和处理数据、通信和消息传递等。在本文中,我们将深入探讨这些常用数据结构的特点和实现方式。

二、数据结构

2.1、元组(Tuple)

元组是一种不可变的有序集合,通常用于存储固定数量的数据项。在 Erlang 中,元组用大括号 {} 表示,其中的元素之间用逗号 , 分隔。元组的元素可以是任何类型的数据,包括原子、整数、浮点数、字符串等。

2.1.1、示例:
Tuple = {1, atom, "hello", 3.14}.
2.1.2、实现:

Erlang 中的元组是不可变的,即一旦创建就不能修改。可以使用模式匹配来访问元组中的元素,也可以使用内置函数来操作元组,如 tuple_size/1 获取元组的大小,element/2 获取元组中指定位置的元素等。

Tuple = {1, atom, "hello", 3.14},
Size = tuple_size(Tuple),  % 获取元组大小
Element = element(2, Tuple).  % 获取第二个元素

2.2、列表(List)

列表是一种可变的有序集合,用于存储可变数量的数据项。在 Erlang 中,列表用方括号 [] 表示,其中的元素之间用逗号 , 分隔。列表的元素可以是任何类型的数据,也可以包含其他列表。

2.2.1、示例
List = [1, 2, 3, 4, 5].
2.2.2、实现

Erlang 中的列表是可变的,可以使用模式匹配和内置函数来操作列表。常见的列表操作包括添加元素、删除元素、查找元素、列表推导等。

List = [1, 2, 3, 4, 5],
Head = hd(List),  % 获取列表的第一个元素
Tail = tl(List),  % 获取列表的尾部
Length = length(List).  % 获取列表的长度
2.2.3、原理

下面举个例子,假设我们有这样一个列表:L = [1,2,ok,done],现在暂时用这个简单的列表来作为示例,这个列表在进程内的示意图如下所示:

在这里插入图片描述
在构造一个新的列表的时候,如果新的列表引用了其他列表,那么引用了其他列表的元素本身就是一个 Cons 单元格。例如,我们有下面两个列表:

L1 = [1, 2, 3].
L2 = [L1, L1, L1]

L2 中存在 3 个对 L1 的引用,Erlang 可以很聪明地复用 L1,内存中实际上只有一份对 L1 的拷贝,如下图所示:
在这里插入图片描述
为了简洁,这个图相比前一个图简化了,不再严格表示栈和堆的相对位置,不再严格表示 Eterm 的标签。从图中可以看到,列表 L2 中的 3 个 cons 单元格都引用了 L1。

3. 字典(Dictionary)

在 Erlang 中,字典(Dictionary)是一种键值对的数据结构,也称为关联数组或映射。字典允许您通过键来检索和存储值,它是一种非常灵活和实用的数据结构。在 Erlang 中,字典通常使用 dict 模块来实现,该模块提供了一组函数来创建、操作和查询字典。

3.1、创建字典

在 Erlang 中创建字典可以使用 dict:new/0 函数,也可以使用 dict:from_list/1 函数从列表中创建。

Dict1 = dict:new().
Dict2 = dict:from_list([{key1, value1}, {key2, value2}, {key3, value3}]).
3.2、添加和删除键值对

使用 dict:store/3 函数可以向字典中添加新的键值对,使用 dict:erase/2 函数可以删除指定键的键值对。

NewDict = dict:store(Key, Value, Dict).
NewDict = dict:erase(Key, Dict).
3.3、获取值

可以使用 dict:find/2 函数通过键来获取字典中对应的值。

{ok, Value} = dict:find(Key, Dict).
3.4、检查键是否存在

使用 dict:is_key/2 函数可以检查字典中是否存在指定的键。

Result = dict:is_key(Key, Dict).
3.5、获取字典大小

可以使用 dict:size/1 函数获取字典的大小,即键值对的数量。

Size = dict:size(Dict).
3.6、遍历字典

Erlang 中遍历字典可以使用递归或者列表推导式等方式,也可以使用 dict:fold/3 函数。

Sum = dict:fold(fun(_, Value, Acc) -> Value + Acc end, 0, Dict).
3.7、合并字典

使用 dict:merge/3 函数可以将两个字典合并为一个新的字典。

MergedDict = dict:merge(Dict1, Dict2, fun(_Key, Val1, Val2) -> Val1 end).
3.8、获取所有键

使用 dict:keys/1 函数可以获取字典中所有的键。

Keys = dict:keys(Dict).
3.9、获取所有值

使用 dict:values/1 函数可以获取字典中所有的值。

Values = dict:values(Dict).

4. 集合(Set)

在 Erlang 中,集合(Set)是一种无序的数据结构,用于存储一组唯一的元素。集合的特点是元素的唯一性和无序性,这使得它适用于许多场景,例如去重、集合操作(如并集、交集、差集等)等。在 Erlang 中,集合通常使用 sets 模块来实现,该模块提供了一组丰富的函数来操作集合。

4.1、创建集合

在 Erlang 中创建集合通常使用 sets:from_list/1 函数,该函数接受一个列表作为参数,并返回一个集合。

Set = sets:from_list([1, 2, 3, 4, 5]).
4.2、添加元素

可以使用 sets:add/2 函数向集合中添加元素。

NewSet = sets:add(6, Set).
4.3、删除元素

使用 sets:del/2 函数可以从集合中删除指定元素。

NewSet = sets:del(3, Set).
4.4、判断元素是否存在

使用 sets:is_element/2 函数可以判断集合中是否存在指定元素。

Result = sets:is_element(3, Set).
4.5、获取集合大小

使用 sets:size/1 函数可以获取集合的大小。

Size = sets:size(Set).

Erlang 的 sets 模块还提供了一些集合操作函数,如并集、交集、差集等。

4.5、并集

使用 sets:union/2 函数可以计算两个集合的并集。

UnionSet = sets:union(Set1, Set2).
4.6、交集

使用 sets:intersection/2 函数可以计算两个集合的交集。

IntersectionSet = sets:intersection(Set1, Set2).
4.7、差集

使用 sets:subtract/2 函数可以计算两个集合的差集。

DifferenceSet = sets:subtract(Set1, Set2).
4.8、遍历集合

Erlang 中遍历集合可以使用递归或者列表推导式等方式,也可以使用 sets:fold/3 函数。

Sum = sets:fold(fun(Elem, Acc) -> Elem + Acc end, 0, Set).

结论

在 Erlang 中,元组、列表、字典和集合是常用的数据结构,它们分别适用于不同的场景和需求。掌握这些数据结构的特点和实现方式,有助于编写高效、可靠的 Erlang 代码。在实际开发中,根据具体的问题和需求,选择合适的数据结构来存储和处理数据,可以提高代码的可读性和性能。

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

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

相关文章

FPGA基于VCU的H265视频压缩,HDMI2.0输入,支持4K60帧,提供工程源码+开发板+技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的视频图像编解码方案 3、详细设计方案设计框图FPGA开发板视频输入Video PHY ControllerHDMI 1.4/2.0 Receiver SubsystemVideo Processing SubsystemVideo Frame Buffer WriteZynq UltraScale VCUPetaLinux 系统制作VLC播放器工…

Collection与数据结构 二叉树(二):二叉树精选OJ面试题(上)

1. 判断是否为相同的二叉树 OJ链接 public boolean isSameTree(Node p, Node q) {if (p null && q ! null || p ! null && q null){//结构不同return false;}if (p null && q null){//结构相同,都是空树return true;}if (p.value ! q.value){//…

vector及cv::Mat删除指定元素并不改变位置

1、vector删除指定元素且不改变原有的顺序 使用erase方法&#xff0c;测试例子如下所示&#xff1a; //测试用例 struct MyStruct {int a;int b; }; std::vector<MyStruct> spotInfo; spotInfo.push_back({ 1,2 }); spotInfo.push_back({ 3,4 }); spotInfo.push_back({…

医疗器械UDI码的DI和PI什么意思

一、理解医疗器械UDI 医疗器械的UDI码是Unique Device Identifier Code的缩写&#xff0c;意为唯一设备识别码。 医疗器械的UDI码是唯一设备识别码&#xff0c;由两个部分组成&#xff1a;DI和PI。 1.1、DI 理解 DI&#xff08;Device Identifier&#xff0c;设备标识符&am…

电池二次利用走向可持续大循环周期的潜力和挑战(第三篇)

一、电池的梯级利用 电池梯级利用&#xff08;Battery Tiered Utilization&#xff09;是一种可持续发展的策略&#xff0c;指的是当电池在其最初的应用场景中不再能满足高性能需求时&#xff0c;通过检测、评估、重组等一系列技术手段&#xff0c;将这些电池转移到对性能要求…

JetBrains RubyMine 2024.1 发布 - 最智能的 Ruby 与 Rails IDE

JetBrains RubyMine 2024.1 发布 - 最智能的 Ruby 与 Rails IDE 请访问原文链接&#xff1a;JetBrains RubyMine 2024.1 (macOS, Linux, Windows) - 最智能的 Ruby 与 Rails IDE&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org…

MobX入门指南:快速上手状态管理库

一、什么是MobX MobX 是一个状态管理库&#xff0c;它可以让你轻松地管理应用程序的状态&#xff0c;并且可以扩展和维护。它使用观察者模式来自动传播你的状态的变化到你的 React 组件。 二、安装及配置 安装 MobX 和 MobX-React&#xff1a;你可以使用 npm 或 yarn 安装这…

DePIN打猎之旅:AI算力作饵,道阻且长

出品&#xff5c;OKG Research 作者&#xff5c;Hedy Bi 香港Web3嘉年华已告一段落&#xff0c;然而Web3自由的脉搏还在跳动&#xff0c;并不断向其他行业渗透。和上一轮周期相比&#xff0c;本轮牛市开启的逻辑是由“原生创新叙事”转变成“主流认可&#xff0c;资金驱动”的…

vue3的创建使用

一、vue3 用vite创建vue3项目 注意node.js版本 创建一个文件夹 首先要 安装npm &#xff1a; npm i 运行 npm run dev 新建了testView alt shift enter 运行js文件 cd .\ project\node .\index.js\ 二、vue3的特性(vue2和vue3的区别) 使用Proxy代替definePropert…

solidworks electrical 2D和3D有什么区别

SolidWorks Electrical 是一款专为电气设计开发的软件工具&#xff0c;它提供了两种主要的工作环境&#xff1a;2D电气设计和3D电气集成设计。两者在功能和应用场景上存在显著的区别&#xff1a; SolidWorks Electrical 2D 设计 特点与用途&#xff1a; SolidWorks Electrica…

水泵轴承的寿命计算

水泵轴承的寿命计算 按平均值法计算滑动轴承的寿命&#xff0c;对参加试验的多个相同滑动轴承&#xff0c;按试验前、后对运动副零件尺寸的精密测量结果&#xff0c;算出平均的磨损量&#xff0c;与滑动运动幅允许的最大配合间隙进行比较&#xff0c;得出运动副的使用寿命或更…

专科学习嵌入式合适吗?

专科学习嵌入式是完全合适的&#xff0c;但确实需要注意一些因素以确保你的学习之路更加顺利。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信2…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果 一、简单介绍 二、简单视频卡通画效果实现原理 三、简单视频卡通画效果…

Mac M2安装 Windows

由于需要在 Windows 上使用一些软件&#xff0c;今天在 Mac M2 上安装了 Windows 11。以前在 X86 Mac 上安装很容易&#xff0c;都是 X86 架构随便找个镜像安装上就可以用了。到了 M1/M2 Arm 架构就会麻烦一些&#xff0c;先在网上找到 Windows 10 Arm 架构的安装镜像&#xff…

(五)PostgreSQL的管理工具pgAdmin

PostgreSQL的管理工具pgAdmin pgAdmin 是一款流行的开源图形界面管理工具&#xff0c;用于 PostgreSQL 数据库的管理和开发。它提供了一个易于使用的界面&#xff0c;允许用户执行各种数据库任务&#xff0c;如创建和修改数据库对象&#xff08;表、视图、索引等&#xff09;、…

【简单讲解下Symfony框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

test4122

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版 文章目录 IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版前言 第一步&#xff1a; IntelliJ IDEA 2024.1安装教程第 0 步&…

中国网站数量竟然比2022年多了10000个

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 CNNIC发布了最新中国互联网报告&#xff0c;报告显示&#xff1a; 2018年中国有523万个网站&#xff0c;2023年13月下降到388万个&#xff0c;5年时间网站数量下降30%&#xff0c;但相比于2022年12月&#xff0c;竟…

ssm042在线云音乐系统的设计与实现+jsp

在线云音乐系统的设计与实现 摘 要 随着移动互联网时代的发展&#xff0c;网络的使用越来越普及&#xff0c;用户在获取和存储信息方面也会有激动人心的时刻。音乐也将慢慢融入人们的生活中。影响和改变我们的生活。随着当今各种流行音乐的流行&#xff0c;人们在日常生活中经…