fn main() {
// Creation
let mut v: Vec = Vec::new();
let v2 = vec![1, 2, 3, 4, 5];
let v3 = vec![0i32; 10]; // ten zeros
// Adding
v.push(10); v.push(20); v.push(30);
v.extend([40, 50]);
v.insert(1, 15); // insert 15 at index 1
// Accessing
println!("{}", v[0]); // panics if OOB
println!("{:?}", v.get(100)); // None, no panic
println!("{:?}", v.first()); // Some(&10)
println!("{:?}", v.last()); // Some(&50)
// Modification
v.remove(1); // removes at index, returns value
v.pop(); // removes last, returns Option
v.retain(|&x| x > 15); // keep only elements where x > 15
println!("{:?}", v);
// Sorting
let mut nums = vec![3,1,4,1,5,9,2,6];
nums.sort();
nums.dedup();
println!("{:?}", nums); // [1, 2, 3, 4, 5, 6, 9]
// Iterating
let sum: i32 = v2.iter().sum();
let doubled: Vec = v2.iter().map(|&x| x*2).collect();
println!("sum={} doubled={:?}", sum, doubled);
// Flat
let nested = vec![vec![1,2],vec![3,4]];
let flat: Vec = nested.into_iter().flatten().collect();
println!("{:?}", flat);
}