What I'd like to do is to assign the same value to part of a Vec.
Given that:
let mut a = vec![0;10];
I'd like to assign 1 to a[..3], assign 2 to a[3..9] and assign 3 to a[9..].
Is there any solution instead of using loop?
let mut a = vec![0; 10];
a[..3].copy_from_slice(&[1; 3]);
a[3..9].copy_from_slice(&[2; 6]);
a[9] = 3;
But it looks strange for me... looks like much unnecessary work is done here. I would prefer just:
let a = vec![1, 1, 1, 2, 2, 2, 2, 2, 2, 4];
Actually, what I described is just a concrete example.
Which part should be assigned to what value is known at runtime.
Assuming that
let arr1 = vec![2,3,1,3,2,4,6,9,2];
let arr2 = vec![2,1,4,3,9,6];
I need to create a Vec arr3 by sorting arr1 in relative order of arr2, which should be
[2,2,2,1,4,3,3,9,6]
I get amount of each element in arr2 by a HashMap, then I need to assign values to parts of arr3.
while loop in line 37-40 is my solution.
You can replace that while
loop with for
loop. Anyway, is there a reason to avoid loop here?
for i in 0..cnt {
ret[bet +i] = elem;
}
Perhaps you would find using a helper function cleaner?
fn assign_all<T: Copy>(slice: &mut [T], value: T) {
for ptr in slice {
*ptr = value;
}
}
fn main() {
let mut a = vec![0; 10];
assign_all(&mut a[..3], 1);
assign_all(&mut a[3..9], 2);
assign_all(&mut a[9..], 3);
}
Thanks for your replies.
It seems that avoiding loop here is not appropriate.
how about this, you only need iterate arr2
let mut a = vec![];
for k in arr2 {
let v = map.get(k).unwrap();
a.extend(std::iter::repeat(k).take(v));
}
It's elegant, but how about their time complexity especially for its extending empty Vec other than allocating space first?
This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.