patternrustMajor
Efficiently insert or replace multiple elements in the middle or at the beginning of a Vec?
Viewed 0 times
insertreplacethemultiplemiddlebeginningvecefficientlyelements
Problem
Is there any straightforward way to insert or replace multiple elements from
I could only find
I could do a
&[T] and/or Vec in the middle or at the beginning of a Vec in linear time?I could only find
std::vec::Vec::insert, but that's only for inserting a single element in O(n) time, so I obviously cannot call that in a loop.I could do a
split_off at that index, extend the new elements into the left half of the split, and then extend the second half into the first, but is there a better way?Solution
As of Rust 1.21.0,
The docs state:
Note 4: This is optimal if:
In this case, the lower bound of the slice's iterator should be exact, so it should perform one memory move.
Replacing a set of items
Prepending to the beginning of a vector
Getting the previous values
Vec::splice is available and allows inserting at any point, including fully prepending: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]The docs state:
Note 4: This is optimal if:
- The tail (elements in the vector after range) is empty
- or
replace_withyields fewer elements than range’s length
- or the lower bound of its
size_hint()is exact.
In this case, the lower bound of the slice's iterator should be exact, so it should perform one memory move.
splice is a bit more powerful in that it allows you to remove a range of values (the first argument), insert new values (the second argument), and optionally get the old values (the result of the call).Replacing a set of items
let mut vec = vec![0, 1, 5];
let slice = &[2, 3, 4];
vec.splice(..2, slice.iter().cloned());
println!("{:?}", vec); // [2, 3, 4, 5]Prepending to the beginning of a vector
let mut vec = vec![0,1,5];
let slice = &[2,3,4];
vec.splice(..0, slice.iter().cloned());
println!("{:?}", vec); // [2, 3, 4, 0, 1, 5]Getting the previous values
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]Code Snippets
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]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,5];
let slice = &[2,3,4];
vec.splice(..0, slice.iter().cloned());
println!("{:?}", vec); // [2, 3, 4, 0, 1, 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]Context
Stack Overflow Q#28678615, score: 73
Revisions (0)
No revisions yet.