Лучший способ заполнить вектор нулевыми байтами?

Мне нужно отправить несколько сообщений (в виде векторов), и они должны быть одинаковой длины. Я хочу заполнить векторы нулями, если они имеют неправильную длину.

Допустим, нам нужно, чтобы все полезные нагрузки имели длину 100. Я подумал, что могу использовать функцию extend и сделать что-то вроде этого:

let len = 100;
let mut msg = &[1,23,34].to_vec();
let  diff : usize = msg.len()-len;
let padding = [0;diff].to_vec();
msg.extend(padding);

Однако это не скомпилируется, так как компилятор жалуется, что diff не является константой. Но также это кажется довольно многословным, чтобы сделать эту простую вещь, которую мы пытаемся сделать.

Есть ли хороший и лаконичный способ сделать это?

FWIW [0;diff].to_vec() помимо того, что не работает (поскольку размер массивов должен быть известен при размере компиляции), слишком сложен: макрос vec! может принимать размер времени выполнения, поэтому vec![0;diff] выполнил бы свою работу. Хотя ответы Хаима все же гораздо предпочтительнее.

Masklinn 23.03.2022 08:48
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
1
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете исправить свой код с помощью std::iter::repeat():

let len = 100;
let mut msg = vec![1, 23, 34];
let diff = len - msg.len();
msg.extend(std::iter::repeat(0).take(diff));

Но есть способ намного лучше — Vec::resize() — это то, что вам нужно:

let len = 100;
let mut msg = vec![1, 23, 34];
msg.resize(len, 0);

Другие вопросы по теме