# Day 6 Did exercise in ch12 to convert Cacher implementation to use generic types ```rust let v1: Vec = vec![1, 2, 3]; let v2: Vec<_> = v1.iter().map(|x| x + 1).collect(); assert_eq!(v2, vec![2, 3, 4]); ``` ```rust #[derive(PartialEq, Debug)] struct Shoe { size: u32, style: String, } fn shoes_in_my_size(shoes: Vec, shoe_size: u32) -> Vec { shoes.into_iter() .filter(|s| s.size == shoe_size) .collect() } #[test] fn filters_by_size() { let shoes = vec![ Shoe { size: 10, style: String::from("sneaker") }, Shoe { size: 13, style: String::from("sandal") }, Shoe { size: 10, style: String::from("boot") }, ]; let in_my_size = shoes_in_my_size(shoes, 10); assert_eq!( in_my_size, vec![ Shoe { size: 10, style: String::from("sneaker") }, Shoe { size: 10, style: String::from("boot") }, ] ); } ``` ^ useful snippets You can convert second example to clone the Vec: ```rust #[derive(PartialEq, Debug, Clone)] struct Shoe { size: u32, style: String, } fn shoes_in_my_size(shoes: &[Shoe], shoe_size: u32) -> Vec { let mut cloned = shoes.to_vec(); cloned.into_iter() .filter(|s| s.size == shoe_size) .collect() } #[test] fn filters_by_size() { let shoes = vec![ Shoe { size: 10, style: String::from("sneaker") }, Shoe { size: 13, style: String::from("sandal") }, Shoe { size: 10, style: String::from("boot") }, ]; let in_my_size = shoes_in_my_size(&shoes, 10); println!("shoes count {}", shoes.len()); assert_eq!( in_my_size, vec![ Shoe { size: 10, style: String::from("sneaker") }, Shoe { size: 10, style: String::from("boot") }, ] ); } ``` but is there a better way? `.to_vec()` copies all members to a new vector -- we only care about the ones that match the filter. they're discarded quickly but if this was a large copy would this still be inefficient if it happened frequently, e.g. in a game loop? ```rust #[derive(PartialEq, Debug, Clone)] struct Shoe { size: u32, style: String, } fn shoes_in_my_size(shoes: Vec, shoe_size: u32) -> Vec { shoes.into_iter() .filter(|s| s.size == shoe_size) .collect() } #[test] fn filters_by_size() { let shoes = vec![ Shoe { size: 10, style: String::from("sneaker") }, Shoe { size: 13, style: String::from("sandal") }, Shoe { size: 10, style: String::from("boot") }, ]; let in_my_size = shoes.clone(); let in_my_size = shoes_in_my_size(in_my_size, 10); println!("shoes count {}", shoes.len()); assert_eq!( in_my_size, vec![ Shoe { size: 10, style: String::from("sneaker") }, Shoe { size: 10, style: String::from("boot") }, ] ); } ``` ^ same problem