我有两个数组声明为:var input []string
和var output []string
。
输入数组最初用一些ID填充。输出数组为NULL。
每次迭代后,我想从输入数组中删除一个随机元素,并将其添加到输出数组中。
最后,输出数组中的所有元素将与输入数组相同(但具有不同的顺序(索引))。
for index := 0; index < len(input); index++ {
if !visited[index] {
//do something
}
}
output[#iteration index] = input[current index]
当我尝试这样做时,我得到array out of bounds error
。
3条答案
按热度按时间aiqt4smr1#
对于
output
阵列,您需要使用append
或为其分配初始容量以匹配input
的大小。这将是我的建议,因为
append
会导致一堆不必要的重新分配,并且您已经知道您需要什么容量,因为它基于input
。另一件事是:
但就像我说的,从我观察到的情况来看,append使初始容量呈指数级增长。如果你没有指定任何东西,这将是基数2,这意味着你将在达到所需的容量之前进行几次不必要的重新分配。
vxqlmq5t2#
你可以在golang/SliceTricks找到一些有用的技巧。
自从引入了
append
内置,在Go 1中删除的container/vector
包的大部分功能可以使用append
和copy
复制。以下是向量方法及其切片操作类似物:
复制
剪切
删除
删除不保留顺序
注意如果元素的类型是 pointer 或带指针字段的struct,需要进行垃圾收集,则上述
Cut
和Delete
的实现存在潜在的 * 内存泄漏 * 问题:一些具有值的元素仍然被切片a
引用,因此不能被收集。下面的代码可以解决这个问题:切
删除
删除不保留顺序
展开
扩展
插入
注意第二个
append
使用自己的底层存储创建一个新切片,并将a[i:]
中的元素复制到该切片,然后这些元素被复制回切片a
(由第一个append
)。可以通过使用替代方式来避免创建新切片(以及因此的内存垃圾)和第二副本:插入
插入向量
弹出
弹出后
推
推前
移位
取消移位
附加技巧
过滤不分配
这个技巧利用了这样一个事实,即一个切片与原始切片共享相同的备份数组和容量,因此存储空间被过滤后的切片重用。当然,原始内容被修改了。
反转
要用相同的元素但以相反的顺序替换切片的内容,请执行以下操作:
同样的事情,除了两个索引:
Shuffle
Fisher-Yates算法:
o3imoua43#
在Go 1.21中,插入,删除(以及更多!)功能可用于切片
示例
插入
删除