try this:
fn get_two_elements<T>(vec: &mut Vec<T>, first: usize, second: usize) -> (&mut T, &mut T) {
assert!(first < second);
assert!(second < vec.len());
if let [first, .., second] = &mut vec[first..=second] {
(first, second)
} else {
unreachable!()
}
}
or
fn get_elements<'a, T>(vec: &'a mut Vec<T>, indexes: &[usize]) -> HashMap<usize, &'a mut T> {
// indexes must be ordered
let mut map = HashMap::new();
let mut vec_ref = vec.as_mut_slice();
let mut skipped_count = 0;
for i in indexes {
let start = *i - skipped_count;
vec_ref = &mut vec_ref[start..];
skipped_count += start;
if let [first, rest @ ..] = vec_ref {
map.insert(*i, first);
vec_ref = rest;
skipped_count += 1;
} else {
break;
}
}
map
}