The Collections track is where everything you've learned — ownership, borrowing, generics, traits — pays off in the data structures you'll use every day. We start with the most common: Vec<T>, the growable array.
A growable, heap-allocated sequence
A Vec<T> holds any number of values of one type T, growing as you push. Unlike an array [T; N] with its compile-time-fixed length, a vector lives on the heap and grows at runtime. It's the default 'I need a list of things' type in Rust.
Push, index, iterate
You push to add, index with [i] (panics out of bounds) or get(i) (returns an Option, no panic), and iterate with for x in &v. The ownership rules apply: iterating with &v borrows, &mut v borrows mutably, v consumes. The borrow checker won't let you push to a vector while iterating it — the iterator-invalidation bug, eliminated.
v[i] panics if i is too big; v.get(i) returns Option<&T> so you handle the missing case safely. Use indexing when you've already proven the bound; use get when the index comes from outside.vec! and capacity
The vec![1, 2, 3] macro builds one inline. Under the hood a Vec has a length and a capacity; pushing past capacity reallocates to a bigger buffer (amortized O(1)). When you know the size ahead, Vec::with_capacity(n) pre-allocates and skips the regrowth.