arrays - 用 replaceSubrange 修改 ArraySlice
问题描述
在尝试在 Swift 中为RosettaCode正确实现 MergeSort 算法(目前列出了一个非常低效的解决方案)时,我发现了一个奇怪的行为。由于 MergeSort 需要递归地将数组传递给函数,因此到目前为止我最有效的实现不是传递数组本身(似乎不能通过引用轻松传递),而是传递该数组的 ArraySlice 视图。
ArraySlice 的文档似乎指出 ArraySlice 不存储其数据,而仅提供底层数组的“视图”:
ArraySlice 类型使您可以快速高效地对较大数组的各个部分执行操作。ArraySlice 实例不是将切片的元素复制到新存储,而是将视图呈现到更大数组的存储上。而且由于 ArraySlice 提供与 Array 相同的接口,因此您通常可以对切片执行与原始数组相同的操作。
但是,使用或设置其元素修改 ArraySlicereplaceSubrange
似乎不会影响我的原始数组。就像在这个例子中一样:
// Create an array
var arr = [Int](repeating: 0, count: 5)
print("array:",arr) // original array
// Modify its ArraySlice
var slice = ArraySlice(arr) // or arr[0..<arr.count]
slice.replaceSubrange(1...3, with: [1,2,3])
slice[4] = 4
print("slice:",slice) // slice preserves all the changes
print("array:",arr) // but original array is not modified
// Modify Array directly
arr.replaceSubrange(1...3, with: [5,6,7])
print("array:",arr) // this time it is modified
输出:
array: [0, 0, 0, 0, 0]
slice: [0, 1, 2, 3, 4]
array: [0, 0, 0, 0, 0]
array: [0, 5, 6, 7, 0]
如您所见,修改 ArraySlice 会对其进行更改,但不会像我预期的那样修改我的原始数组。
问题是,为什么会发生?我修改后的 ArraySlice 的底层存储是什么?特别是,元素4
存储在哪里?
解决方案
推荐阅读
- pandas - 从 deltas 数据帧重建 L2 订单簿数据帧
- sql - 将小时数添加到日期时间字段,结果在午餐时间/假期和额外时间的工作时间内
- python - 使用 dataclasses.MISSING 作为 Python 数据类的可选参数值?
- struct - 如何在scala native中按名称访问结构成员?
- android - Android Studio 和自动登录到一个页面
- c - argv[] 中的 int 参数
- xml - WiX 引导程序主题中的多图像广告牌
- php - 如何修改 DateTimeImmuable?
- powershell - Jq - 在 windows powershell 上运行时出现语法错误,但在 bash 终端上运行成功
- javascript - JavaScript如何更改图像onclick事件