שיעורי מודול (1/2)
אוספים ו-HashMap
אוספים הם מבני נתונים המסוגלים להחזיק ערכים מרובים. בניגוד לסוגי המערך הפרימיטיביים וה-tuples, הנתונים שהאוספים הללו מתייחסים אליו מאוחסנים בערימה, מה שאומר שכמות הנתונים לא צריכה להיות ידועה בזמן ההידור והיא יכולה לגדול או להתכווץ באופן דינמי במהלך הפעלת התוכנית.
שני האוספים הנפוצים ביותר ב-Rust הם וקטורים (Vec<T>) ומפות מפתח-ערך (HashMap<K, V>).
וקטורים (Vec<T>)
וקטורים מאפשרים לך לאחסן יותר מערך אחד מאותו סוג במבנה נתונים בודד שמציב את כל הערכים זה ליד זה בזיכרון:
fn main() {
// Creating an empty mutable vector
let mut v: Vec<i32> = Vec::new();
// Or using the vec! macro
let mut v2 = vec![1, 2, 3];
// Appending elements
v.push(5);
v.push(6);
// Accessing elements by index
let third = v2[2];
println!("The third element is: {}", third);
}HashMap (HashMap<K, V>)
אוסף HashMap<K, V> מאחסן מיפוי של מפתחות מסוג K לערכים מסוג V. הוא פועל באמצעות פונקציית גיבוב, שקובעת כיצד מפתחות וערכים אלו ממוקמים בזיכרון. זה שימושי ביותר כאשר אתה רוצה לחפש נתונים לא לפי אינדקס מספרי, אלא לפי מפתח (כגון שם או מזהה).
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
// Inserting key-value pair
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
// Reading a value (returns an Option<&V>)
let team_name = String::from("Blue");
let score = scores.get(&team_name);
match score {
Some(val) => println!("Score: {}", val),
None => println!("No score found."),
}
}נסה זאת בעצמך
תרגיל 1: פעולות בסיסיות ב-Vec
הכריז על וקטור מספר שלם שניתן לשינוי בשם v באמצעות Vec::new(). הוסף את האלמנטים 10, 20 ו-30 ברצף באמצעות שיטת הדחיפה. לבסוף, הדפס את האלמנט הראשון של הווקטור (אינדקס 0) באמצעות println!.
הצג רמז
השתמש ב-'let mut v = Vec::new();' כדי לאתחל את הווקטור, הכנס אלמנטים עם 'v.push(value)' וגישה עם 'v[0]'.
הפתרון זמין לאחר 3 ניסיונות
תרגיל 2: ציוני משתמש עם HashMap
ייבוא standard::collections::HashMap. בפונקציה הראשית, הכריז על HashMap שניתן לשינוי בשם ציונים לאחסון מפתחות מחרוזת וערכי i32. הכנס ציון של 50 למשתמש 'אליס'. חלץ את הניקוד בבטחה באמצעות שיטת get ו- unwrap() כדי להדפיס אותו.
הצג רמז
אל תשכח את `השתמש ב-std::collections::HashMap;`. הוסף עם `scores.insert(String::from("Alice"), 50);`ואחזר את הערך עם`.get("Alice").unwrap()`.
הפתרון זמין לאחר 3 ניסיונות
תרגיל 3: הכפלת ערכים בוקטור
הגדר פונקציה בשם double_values שמקבלת הפניה לפרוסה של מספרים שלמים &[i32] ומחזירה Vec<i32> חדש המכיל את אותם אלמנטים כפול 2.
הצג רמז
הפונקציה צריכה לחזור על רכיבי הפרוסה ולהכניס אותם כפול 2 לוקטור החדש שיוחזר.
הפתרון זמין לאחר 3 ניסיונות