Создание вектора нулей заданного размера в Rust
Использование макроса vec! с явным указанием типа
Основная проблема вашего кода — Rust строго типизирован, и литерал 0 по умолчанию является целым числом (i32), а не f64. Чтобы создать вектор из f64 нулей, нужно явно указать тип литерала или использовать приведение:
let v: Vec<f64> = vec![0.0; 5]; // Работает! 0.0 — литерал f64
let v2 = vec![0.0_f64; 5]; // Альтернативный синтаксис
Более производительный способ: Vec::from_elem (требуется nightly)
Если вам нужна максимальная производительность и вы используете nightly-версию компилятора, можно применить экспериментальный метод Vec::from_elem:
#![feature(vec_from_elem)]
let v: Vec<f64> = Vec::from_elem(0.0, 5);
Идиоматичный способ: (0..n).map().collect()
Наиболее распространённый и гибкий подход — использование итераторов:
let v: Vec<f64> = (0..5).map(|_| 0.0).collect();
Этот метод особенно полезен, когда нужно заполнить вектор не константой, а вычисляемыми значениями (например, последовательностью).
Инициализация с помощью unsafe (для экстремальной производительности)
Если размер вектора известен заранее и вы уверены в безопасности, можно выделить память без инициализации и заполнить её вручную:
let mut v = Vec::with_capacity(5);
unsafe { v.set_len(5); }
for x in &mut v {
*x = 0.0;
}
Этот подход используется в критически важных по производительности местах, но требует осторожности: если забудете заполнить память, получите неопределённое поведение.
Рекомендация для новичков
- Для простых случаев (копируемые типы вроде
f64,i32) используйтеvec![0.0; n]— это кратко и эффективно. - Для сложных типов (например,
String) используйте(0..n).map(|_| String::new()).collect(). - Избегайте unsafe на ранних этапах обучения — большинство задач можно решить безопасными средствами.
В вашем случае для вектора из 1000 f64 нулей идеально подойдёт:
let zeros: Vec<f64> = vec![0.0; 1000];
<<Использование массива и преобразование в вектор
Если размер вектора небольшой и известен на этапе компиляции, можно сначала создать массив, а затем преобразовать его в вектор:
let arr = [0.0_f64; 1000]; // Массив на стеке
let vec_from_arr = arr.to_vec(); // Преобразование в Vec
Этот метод эффективен, но массив должен быть фиксированного размера (не более 32 элементов для типажа Copy по умолчанию, хотя для больших массивов можно использовать Box).
Библиотека ndarray для научных расчётов
Если вы работаете с большими объёмами данных (например, машинное обучение), рекомендую рассмотреть крейт ndarray:
use ndarray::Array1;
let zeros = Array1::<f64>::zeros(1000);
Это даёт больше возможностей для работы с многомерными массивами, чем стандартный Vec.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги
Деплой Swift приложения на VPS: пошаговая инструкция