Swift 团队于上周开源新软件包 Swift Collections,以扩展 Swift 的数据结构集合。这个新的开源软件包与 Swift Algorithms 和 Swift Numerics 一样,目的在于扩展 Swift 标准库的新功能。Swift 标准库目前实现了三个最基本的通用数据结构:Array、Set 和 Dictionary,这几个数据结构可以满足基本的需求,但有时候为了更有效地解决问题或保持不变性,开发人员可能需要更多的数据结构。而 Swift Collections 软件包就提供了不少新的数据结构,以让开发人员可以以更少的精力编写更快、更可靠的程序。

我们这里简要介绍一下 Swift Collections 里新的数据结构。

Collections 包的初始版本包含三个最常用的数据结构的实现:双端队列,有序集合和有序字典。

Deque

Deque 的工作方式与 Array 十分相似:它是一个有序、可随机访问、可变、范围可替换且具有整数索引的集合。Deque 优于 Array 的主要好处是它支持两端的有效插入和删除。如果需要 FIFO 队列时,双端队列都是一个不错的选择。

var colors: Deque = ["red", "yellow", "blue"]colors.prepend("green")
colors.append("orange")
// `colors` is now ["green", "red", "yellow", "blue", "orange"]colors.popFirst() // "green"
colors.popLast() // "orange"
// `colors` is back to ["red", "yellow", "blue"]

也可以使用任何熟悉的 MutableCollection 和 RangeReplaceableCollection 方法来访问和修改集合的元素。索引的工作方式与数组中完全相同 – 第一个元素始终位于索引零处:

colors[1] // "yellow"
colors[1] = "peach"
colors.insert(contentsOf: ["violet", "pink"], at: 1)
// `colors` is now ["red", "violet", "pink", "peach", "blue"]
colors.remove(at: 2) // "pink"
// `colors` is now ["red", "violet", "peach", "blue"]
colors.sort()
// `colors` is now ["blue", "peach", "red", "violet"]

为了支持在前面的有效插入,双端队列需要放弃将其元素保持在连续的缓冲区中。对于不需要在前端插入/删除元素的情况,这往往会使它们的工作速度比数组慢一些,因此用双端队列盲目替换所有数组可能不是一个好主意。

OrderedSet

OrderedSet 是数组和集合的强大混合体。我们可以使用任何符合 Hashable 协议的元素类型创建有序集合:

let buildingMaterials: OrderedSet = ["straw", "sticks", "bricks"]

像 Array 一样,有序集合按用户指定的顺序维护其元素,并支持对其成员的有效随机访问遍历:

for i in 0 ..< buildingMaterials.count {print("Little piggie #\(i) built a house of \(buildingMaterials[i])")
}
// Little piggie #0 built a house of straw
// Little piggie #1 built a house of sticks
// Little piggie #2 built a house of bricks

像 Set 一样,有序集合可确保每个元素仅出现一次并提供有效的成员测试:

buildingMaterials.append("straw") // (inserted: false, index: 0)
buildingMaterials.contains("glass") // false
buildingMaterials.append("glass") // (inserted: true, index: 3)
// `buildingMaterials` is now ["straw", "sticks", "bricks", "glass"]

OrderedSet 用标准数组来存储元素,可以以最小的开销提取元素。如果我们要将有序集合的内容传递给仅接受数组的函数(或在 RangeReplaceableCollection 或 MutableCollection 上通用)的函数,则可以用以下方式:

func buildHouses(_ houses: Array<String>)buildHouses(buildingMaterials) // error
buildHouses(buildingMaterials.elements) // OK

OrderedDictionary

当元素的顺序很重要或我们需要能够有效访问集合中各个位置的元素时, OrderedDictionary 是 Dictionary 的有用替代方法。我们可以使用符合 Hashable 协议的任何键类型创建有序字典:

let responses: OrderedDictionary = [200: "OK",403: "Forbidden",404: "Not Found",
]

OrderedDictionary 提供了许多与 Dictionary 相同的操作。例如,我们可以使用下标有效地查找并添加值:

responses[200] // "OK"
responses[500] = "Internal Server Error"

如果使用下标设置器添加了新条目,则它将添加到字典的末尾。因此,默认情况下,字典按其最初插入的顺序包含其元素:

for (code, phrase) in responses {print("\(code) (\(phrase))")
}
// 200 (OK)
// 403 (Forbidden)
// 404 (Not Found)
// 500 (Internal Server Error)

有序字典由包含键的 OrderedSet 以及包含其关联值的常规 Array 组成。可以以最小的开销提取其中的每一个元素,这是与期望某种类型的函数进行互操作的有效选择。

Swift Collections 与标准库的关系

与 Swift Numerics 和 Swift Algorithms 一样,Collections 初期目标是提供这些新数据结构的一个试验场,最终目标则是要将这些数据结构合并到标准库中。

由于目前标准库是 ABI 稳定的,因此需要花大量时间考量新的数据结构哪些归类到 @frozen 而哪些不是,哪些方法应该是 @inlinable 并可触及内部结构。另外 Collections 不仅仅是一组数据结构,如果开发人员希望进一步了解 ABI 设计的黑科技及完善的工具包,这也是个不错的学习资源。

同时,Swift 团队也鼓励开发人员积极参与到其中。由于这个软件包的重点是提供生产级数据结构的实现,因此标准也会很高,主要是关注可靠性、运行时性能和内存开销。

https://swift.org/blog/swift-collections/

Swift 团队开源 Collections,提供更多高效数据结构相关推荐

  1. Swift团队把Swift之父气跑了,网友:Python之父的仁慈独裁者模式才是王道

    梦晨 发自 凹非寺 量子位 | 公众号 QbitAI 苹果Swift语言.LLVM编译器之父Chris Lattner的新动向,引起程序员圈关注. 这位编译器大神现在与Swift核心团队分道扬镳.彻底 ...

  2. OpenCV开发团队开源计算机视觉标注工具CVAT

    OpenCV开发团队开源计算机视觉标注工具Computer Vision Annotation Tool (CVAT) 同时支持图像和视频的标注,最大特点是专业!专业团队做的专业水准的工具! (关注& ...

  3. MMKV:微信团队开源的轻量级存储方案

    目录 定义 优点 出现的意义 原理 定义 基于 mmap 内存映射的 key-value 存储组件 是一个类似于SharedPreferences的轻量级存储方案 微信团队开源 优点 操作灵活.安全性 ...

  4. 南大周志华团队开源深度森林软件包DF21:训练效率高、超参数少,普通设备就能跑 | AI日报...

    中国学者研发新型电子纹身,实现8倍延展,有望用于医疗.VR和可穿戴机器人等领域 可穿戴设备,已经成为我们生活中极为常见的一种设备,它们体积轻巧.佩戴方便.检测数据齐全,但也存在一个很明显的缺点--无法 ...

  5. Swift团队逼走创始人?本人回应表示团队“有毒”

    整理 | 郭露 出品 | CSDN(ID:CSDNnews) Chris Lattner作为苹果新编程语言Swift的创造人,在Swift上可谓是花尽了心思.自2014年推出以来,Lattner坚持参 ...

  6. 腾讯QQ团队开源分布式后台毫秒服务引擎全解析:引擎架构、RPC、灰度……

    腾讯QQ团队将于12月4日开源一个服务开发运营框架,叫做毫秒服务引擎(Mass Service Engine in Cluster,MSEC),它集RPC.名字发现服务.负载均衡.业务监控.灰度发布. ...

  7. 腾讯QQ团队开源分布式后台服务引擎msec

    转载:http://www.devstore.cn/essay/essayInfo/6851.html 在服务器端程序开发领域,性能问题一直是备受关注的重点.业界有大量的框架.组件.类库都是以性能为卖 ...

  8. iVox (Faster-Lio): 智行者高博团队开源的增量式稀疏体素结构

    Faster-Lio 是智行者高博团队和清华于 2022 年初公开的工作,论文<Faster-LIO: Lightweight Tightly Coupled Lidar-inertial Od ...

  9. 登上更高峰!颜水成、程明明团队开源ViP,引入三维信息编码机制,无需卷积与注意力...

    导读 本文从位置信息编码出发,引入了高-宽-通道三维信息编码机制.为进一步校正不同分支的作用,提出了加权融合方式.ViP在ImageNet上取得了83.2%的top1精度,代码已开源. 标题& ...

  10. 设计一款博弈类游戏的人机对战算法、策略_卡牌游戏八合一,华人团队开源强化学习研究平台RLCard...

    雷锋网 AI 科技评论按:在过去的两三年中,我们经常听说人工智能在棋牌类游戏(博弈)中取得新的成果,比如基于深度强化学习的 AlphaGo 击败了人类世界冠军,由 AlphaGo 进化而来的 Alph ...

最新文章

  1. Cache与主存的三种映射
  2. c# 收取邮件 解析,C#电子邮件主题解析
  3. html5开发app的缺点,全解HTML 5在移动Web应用的优劣势
  4. RSA 非对称加密原理
  5. ES6_解构赋值_note
  6. 2017年10月份计算机网络管理,2017年下半年网络管理员考试上午试题及答案
  7. vue + echarts 实现以中国为中心的世界3D地图
  8. 2012年最具影响力路由器配置精品文章荟萃【108篇】
  9. 织梦首页php打开慢,DEDECMS网站打开速度慢解决方法
  10. X64dbg-插件开发-字符编码-常用插件函数-回调结构
  11. python谷歌小恐龙,这还是你断网时的样子嘛~
  12. C++全角与半角互转
  13. 5 打印选课学生名单 (25 分)
  14. 房山大数据北师大_北京师范大学2019级本科生新生大数据
  15. 脱离实际,技术就是屠龙之技
  16. 【MATLAB】MATLAB快速入门编程技巧
  17. 双人联网贪吃蛇C语言,关于C 双人贪吃蛇显示的问题
  18. AU2019直装版/Audition CC2019安装包
  19. windows系统下搭建cloudreve网盘系统
  20. 先学C语言好还是先学JAVA好

热门文章

  1. A useful link to learn PDF
  2. Android四大组件-Broadcast Receiver
  3. freeCodeCamp:Seek and Destroy
  4. 点击实现页面的跳转及跳转到同一页面的不同iframe模块(也许标题看不清楚,但是想实现功能性跳转的请看内容)...
  5. 【leetcode】617. Merge Two Binary Trees
  6. bzoj1010: [HNOI2008]玩具装箱toy
  7. 立志做个有激情的coder
  8. 宋体、代码-iOS网络编程实践--NSStream实现TCP Socket iPhone客户端-by小雨
  9. spring Bean的生命周期管理
  10. 关于C#对Excel导出时对整行的操作