gpt4 book ai didi

rust - 在 Vec 的中间或开头高效地插入或替换多个元素?

转载 作者:行者123 更新时间:2023-11-29 08:20:57 36 4
gpt4 key购买 nike

有没有直接的方法来插入或替换 &[T] 中的多个元素?和/或 Vec<T>Vec 的中间或开头在线性时间内?

我只能找到 std::vec::Vec::insert , 但这仅用于在 O(n) 中插入单个元素时间,所以我显然不能在循环中调用它。

可以split_off在该索引处,extend将新元素放入拆分的左半部分,然后extend下半场进入上半场,但有更好的方法吗?

最佳答案

自 Rust 1.21.0 起,Vec::splice可用并允许在任何点插入,包括完全前置:

let mut vec = vec![1, 5];
let slice = &[2, 3, 4];

vec.splice(1..1, slice.iter().cloned());

println!("{:?}", vec); // [1, 2, 3, 4, 5]

文档状态:

Note 4: This is optimal if:

  • The tail (elements in the vector after range) is empty
  • or replace_with yields fewer elements than range’s length
  • or the lower bound of its size_hint() is exact.

在这种情况下,切片迭代器的下界应该是精确的,因此它应该执行一次内存移动。


splice 更强大一点,因为它允许您删除一系列值(第一个参数),插入新值(第二个参数),并可选择获取旧值(调用结果)。

替换一组元素

let mut vec = vec![0, 1, 5];
let slice = &[2, 3, 4];

vec.splice(..2, slice.iter().cloned());

println!("{:?}", vec); // [2, 3, 4, 5]

获取之前的值

let mut vec = vec![0, 1, 2, 3, 4];
let slice = &[9, 8, 7];

let old: Vec<_> = vec.splice(3.., slice.iter().cloned()).collect();

println!("{:?}", vec); // [0, 1, 2, 9, 8, 7]
println!("{:?}", old); // [3, 4]

关于rust - 在 Vec 的中间或开头高效地插入或替换多个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47249206/

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