Vec
Vec
— стандартний буфер із змінним розміром, виділений у купі:
fn main() { let mut v1 = Vec::new(); v1.push(42); println!("v1: len = {}, capacity = {}", v1.len(), v1.capacity()); let mut v2 = Vec::with_capacity(v1.len() + 1); v2.extend(v1.iter()); v2.push(9999); println!("v2: len = {}, capacity = {}", v2.len(), v2.capacity()); // Канонічний макрос для ініціалізації вектора з елементами. let mut v3 = vec![0, 0, 1, 2, 3, 4]; // Зберігаємо тільки парні елементи. v3.retain(|x| x % 2 == 0); println!("{v3:?}"); // Видаляємо дублікати, що йдуть підряд. v3.dedup(); println!("{v3:?}"); }
Vec
реалізує Deref<Target = [T]>
, який означає, що ви можете викликати методи зрізу на Vec
.
This slide should take about 5 minutes.
Vec
— це тип колекції разом ізString
іHashMap
. Дані, які він містить, зберігаються в купі. Це означає, що кількість даних не потрібно знати під час компіляції. Він може рости або зменшуватися під час виконання.- Зверніть увагу, що
Vec<T>
також є узагальненим типом, але вам не потрібно вказуватиT
явно. Як завжди з визначенням типу Rust,T
було встановлено під час першого викликуpush
. vec![...]
— це канонічний макрос для використання замістьVec::new()
, який підтримує додавання початкових елементів до вектора.- Щоб індексувати вектор, ви використовуєте
[
]
, але вони панікують, якщо вийдуть за межі. Крім того, використанняget
повернеOption
. Функціяpop
видалить останній елемент. - Зрізи розглядаються на 3-й день. Наразі студентам потрібно лише знати, що значення типу
Vec
дає доступ до всіх задокументованих методів зрізів.