gpt4 book ai didi

go - 有效地将一个 slice 插入另一个 slice

转载 作者:IT王子 更新时间:2023-10-29 01:50:50 33 4
gpt4 key购买 nike

在 Go 中,您可以将一个 slice 插入另一个 slice 的中间 like this :

a = append(a[:i], append(b, a[i:]...)...)

但是,据我了解,首先会将 a[i:] 复制到 b 的末尾,从而将其附加到 b (并可能重新分配 b然后 将整个 slice 复制到 a,再次可能重新分配它。

这似乎是您真正需要的额外副本和分配。在 C++ 中,我会这样做(我的意思是......显然不使用 insert)。

// Reserve enough space in `a` for `a` and `b`.
a.reserve(a.size() + b.size());

// Move the second half of `a` to the end.
std::copy(a.begin() + i, a.end(), a.begin() + i + b.size());

// Copy `b` into the middle.
std::copy(b.begin(), b.end(), a.begin() + i);

在 Go 中有类似的方法吗?

最佳答案

假设有一个 int slice ,这是 Go 的翻译:

// Reserve space for the combined length of the slices
c := make([]int, len(a)+len(b))

// Copy the first part of a to the beginning
copy(c, a[:i])

// Copy the last part of a to the end
copy(c[i+len(b):], a[i:])

// Copy b to the middle
copy(c[i:], b)

playground example

要利用 a 的容量,请执行以下操作:

if cap(a) < len(a)+len(b) {
// Not enough space, allocate new slice
c := make([]int, len(a)+len(b))

// Copy the first part of a to the beginning
copy(c, a[:i])

// Copy the last part of a to the end
copy(c[i+len(b):], a[i:])

a = c
} else {
// reslice to combined length
a = a[:len(a)+len(b)]

// copy the last part of a to the end
copy(a[i+len(b):], a[i:])

}
// copy b to the middle
copy(a[i:], b)

playground example

关于go - 有效地将一个 slice 插入另一个 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47846593/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com