vector - 如何连接两个切片或两个向量并且仍然可以访问原始值?
问题描述
我有两个切片或向量,我想添加它们,如 Golang 中所示:
a := []byte{1, 2, 3}
b := []byte{4, 5, 6}
ab := append(a, b...)
ba := append(b, a...)
我怎样才能在 Rust 中做到这一点?我发现了一些其他问题,例如:
但是,他们所有的最佳答案都是a += b
,而不是ab = a + b
。
let mut a = vec![1, 2, 3];
let mut b = vec![4, 5, 6];
a.append(&mut b);
assert_eq!(a, [1, 2, 3, 4, 5, 6]);
assert_eq!(b, []);
或者可能有像Vec::append(a, b)
Rust 那样的函数?
解决方案
你可以chain
你的迭代器:
fn main() {
let a = vec![1, 2, 3];
let b = vec![4, 5, 6];
// Don't consume the original vectors and clone the items:
let ab: Vec<_> = a.iter().chain(&b).cloned().collect();
// Consume the original vectors. The items do not need to be cloneable:
let ba: Vec<_> = b.into_iter().chain(a).collect();
assert_eq!(ab, [1, 2, 3, 4, 5, 6]);
assert_eq!(ba, [4, 5, 6, 1, 2, 3]);
}
请注意,迭代器知道它产生的项目数,因此collect
可以直接分配正确的内存量:
fn main() {
let a = vec![1, 2, 3];
let b = vec![4, 5, 6];
let ba = b.into_iter().chain(a);
assert_eq!(ba.size_hint(), (6, Some(6)));
let ba: Vec<_> = ba.collect();
assert_eq!(ba, [4, 5, 6, 1, 2, 3]);
}
推荐阅读
- html - 如何使标题适合页面限制
- node.js - 无法使用 updateTabs API 更新文本选项卡值
- php - 如何在php文件内的特定行中插入文本?
- javascript - 带有 2 个示例的递归基础知识
- android - 我无法在 WhatsApp Private 文件夹和图库中查看 WhatsApp 媒体图像
- iphone - 视频无法在 iPhone 上播放
- android - Android TV 开发,如何配置我自己的应用程序以添加到此列表中
- python - 如何将画布的(行,列)位置的边界框作为网格元组返回
- amazon-web-services - CMK Key1 在轮换/过期/删除时会发生什么情况?如果我们为该 CMK Key1 使用 CMK 别名:跨账户甚至相同账户引用?
- java - 如何在 M1 MacBook Air 上打开 TerraER2.23.jar