У меня есть неизменяемые векторы a
и b
, где элементы дешевы для копирования, и я хочу создать вектор, который формирует конкатенацию этих существующих векторов без их изменения (*).
Более ранний вопрос касался его, если один из векторов является изменяемым , поэтому очевидным ответом является первый вектор клона a
, например,
let mut r = a.clone();
r.extend(&b);
, но это не кажется ни изящным, ни эффективным (расширениеможет легко вызвать одно ненужное перераспределение, верно?). (исправленная) лучшая альтернатива I (будучи нубом Rust) предлагает :
fn cat(a: &Vec<i32>, b: &Vec<i32>) -> Vec<i32> {
let mut r = Vec::<i32>::with_capacity(a.len() + b.len());
r.extend(a);
r.extend(b);
r
}
Поскольку копировать элементы дешево, ответ на более общий вопрос для векторов строк должен применяться здесь, но vec![a, b].concat()
, кажется, работает, только если вы строите вектор векторов, перемещая в него векторы, потому что vec![&a, &b].concat()
выдает «метод с именем concat
found».
Существует ли однострочник для этой, казалось бы, простой работы, даже если она не оптимальна?
(*) оказывается, что есть два значения слова "без изменений":
- просто неизменный, что в Rust означает, что если код компилируется, он не увидит переменную с измененным значением;но переменная может быть удалена, и дальнейший или будущий код больше не сможет ее использовать
- фактически только для чтения, оставляя переменную нетронутой для дальнейшего или будущего кода