از بردارها گرفته تا هاشست: پیمایش ساختارهای داده Rust

کتابخانه استاندارد Rust ساختارهای اساسی داده مانند بردارها را ارائه می دهد (Vec
) ، نقشه های هش (HashMap
) ، و مجموعه های هش (HashSet
). این سه ساختار داده رایج ترین و مفید در بیشتر سناریوهای برنامه نویسی هستند. طراحی آنها با اهداف Rust در ارائه یک زبان برنامه نویسی ایمن ، همزمان و عملی هماهنگ است. این سازه ها ضمن حفظ ماهیت سبک و کارآمد کتابخانه استاندارد Rust ، بیشتر نیازهای ذخیره و دسترسی به داده ها را پوشش می دهند.
بردارها (Vec
)
یک بردار متداول ترین اجرای آرایه پویا است که از آن استفاده می شود. این امکان دسترسی سریع به فهرست بندی شده ، تغییر اندازه پویا و گذرگاه کارآمد را به دلیل ذخیره حافظه متناوب ، که از مکانیسم های ذخیره سازی مدرن CPU استفاده می کند ، فراهم می کند.
fn main() {
// Create an empty vector
let mut numbers: Vec<i32> = Vec::new();
// Create and initialize a vector using a macro
let mut names = vec!["Alice", "Bob", "Carol"];
// Add elements to the vector
numbers.push(1);
numbers.push(2);
numbers.push(3);
// Remove elements from the vector
numbers.pop(); // Removes and returns the last element
// Access elements in the vector
if let Some(first_name) = names.get(0) {
println!("The first name is: {}", first_name);
}
// Iterate through vector elements
for name in &names {
println!("{}", name);
}
// Modify elements in the vector
if let Some(first_name) = names.get_mut(0) {
*first_name = "Dave";
}
// Use an iterator to process vector elements
let numbers_squared: Vec<i32> = numbers.iter().map(|&x| x * x).collect();
println!("Squared numbers: {:?}", numbers_squared);
// Extend the vector with additional elements
numbers.extend([4, 5, 6].iter().copied());
// Directly access elements using an index
println!("Second name: {}", names[1]); // Note: Direct indexing may panic
}
بردارها برای رسیدگی به توالی عناصر از همان نوع ، چه رشته ها ، عدد صحیح یا انواع سفارشی ایده آل هستند. آنها امکان افزودن عناصر آسان ، حذف و دسترسی تصادفی را فراهم می کنند.
نقشه های هه (HashMap
)
نقشه هش ذخیره سازی ارزش کلیدی را با استفاده از یک جدول هش اجرا می کند. این برنامه از جستجوی سریع ، درج و حذف پشتیبانی می کند و آن را به یک ساختار داده مهم برای بازیابی و مدیریت داده های کارآمد تبدیل می کند.
use std::collections::HashMap;
fn main() {
// Create an empty hash map
let mut book_reviews: HashMap<String, String> = HashMap::new();
// Add elements to the hash map
book_reviews.insert("The Hobbit".to_string(), "Excellent fantasy book".to_string());
book_reviews.insert("The Catcher in the Rye".to_string(), "Classic novel".to_string());
// Access elements in the hash map
if let Some(review) = book_reviews.get("The Hobbit") {
println!("Review of The Hobbit: {}", review);
}
// Remove elements from the hash map
book_reviews.remove("The Catcher in the Rye");
// Iterate over the hash map
for (book, review) in &book_reviews {
println!("{}: {}", book, review);
}
// Update elements in the hash map
book_reviews.entry("The Hobbit".to_string()).or_insert("No review found".to_string());
book_reviews.entry("1984".to_string()).or_insert("Dystopian science fiction".to_string());
let mut scores = HashMap::new();
// Insert directly using `insert`
scores.insert("Blue", 10);
scores.insert("Blue", 25); // Overwrites the previous value
// Use `entry` to update or insert
scores.entry("Yellow").or_insert(50); // Inserts because "Yellow" does not exist
scores.entry("Blue").or_insert(50); // Does nothing because "Blue" already exists
// Result: {"Blue": 25, "Yellow": 50}
// Check if a key exists
if book_reviews.contains_key("1984") {
println!("Review for 1984 is available.");
}
}
نقشه های هش در صورت نیاز به دسترسی سریع به داده ها با استفاده از کلیدها ، مانند فهرست بندی پایگاه داده و اجرای حافظه نهان ، مفید هستند. آنها انجمن های با ارزش کلیدی انعطاف پذیر را ارائه می دهند ، سازمان داده ها را ساده و کارآمد می کنند.
مجموعه های هش (HashSet
)
مجموعه هش یک مجموعه بدون هماهنگ است که عناصر منحصر به فرد را ذخیره می کند. این کار با استفاده از یک جدول هش ، ارائه سریع جستجوی ، درج و عملیات حذف انجام می شود.
use std::collections::HashSet;
fn main() {
// Create an empty set
let mut numbers = HashSet::new();
// Add elements to the set
numbers.insert(1);
numbers.insert(2);
numbers.insert(3);
// Remove an element from the set
numbers.remove(&3);
// Check if an element exists in the set
if numbers.contains(&1) {
println!("1 is in the set");
}
// Iterate over the set
for number in &numbers {
println!("{}", number);
}
// Set operations: union, intersection, difference, symmetric difference
// At this point, numbers contain {1, 2}
let other_numbers = [2, 3, 4].iter().cloned().collect::<HashSet<_>>();
// other_numbers contain {2, 3, 4}
let union = numbers.union(&other_numbers).cloned().collect::<HashSet<_>>();
println!("Union: {:?}", union);
// Union: `{1, 2, 3, 4}` (all unique elements from both sets)
let intersection = numbers.intersection(&other_numbers).cloned().collect::<HashSet<_>>();
println!("Intersection: {:?}", intersection);
// Intersection: `{2}` (common elements)
let difference = numbers.difference(&other_numbers).cloned().collect::<HashSet<_>>();
println!("Difference: {:?}", difference);
// Difference: `{1}` (elements in `numbers` but not in `other_numbers`)
let symmetric_difference = numbers.symmetric_difference(&other_numbers).cloned().collect::<HashSet<_>>();
println!("Symmetric Difference: {:?}", symmetric_difference);
// Symmetric Difference: `{1, 3, 4}` (elements unique to each set)
}
مجموعه های هش به ویژه برای رسیدگی به مجموعه های عناصر منحصر به فرد ، مانند لیست شناسه های کاربر و سوابق تحت شرایط خاص مفید هستند. عملیات تنظیم شده مانند اتحادیه ، تقاطع و تفاوت ابزارهای قدرتمندی را برای مدیریت کارآمد داده ها فراهم می کند.
لیست دو برابر پیوند (LinkedList
)
LinkedList
یک لیست مضاعف مرتبط است که توسط کتابخانه استاندارد Rust ارائه شده است. در مقایسه با بردارها (Vec
) ، لیست های مرتبط امکان درج کارآمد و حذف عناصر ، به ویژه در آغاز یا پایان لیست را فراهم می کنند. با این حال ، آنها در دسترسی تصادفی عملکرد ضعیفی دارند.
use std::collections::LinkedList;
fn main() {
// Create a new empty linked list
let mut list: LinkedList<i32> = LinkedList::new();
// Add elements to the back of the list
list.push_back(1);
list.push_back(2);
// Add elements to the front of the list
list.push_front(0);
// Pop elements from the front and back of the list
assert_eq!(list.pop_front(), Some(0));
assert_eq!(list.pop_back(), Some(2));
// Iterate over the list
for elem in list.iter() {
println!("{}", elem);
}
// Modify elements in the list (requires using an iterator)
let mut iter_mut = list.iter_mut();
if let Some(first_elem) = iter_mut.next() {
*first_elem = 3;
}
// Print the modified list
println!("Modified list: {:?}", list);
}
هنگامی که موارد اضافی یا حذف های مکرر در ابتدا یا پایان یک لیست مورد نیاز است ، LinkedList
انتخاب خوبی است ، زیرا این عملیات از پیچیدگی زمانی O (1) برخوردار است.
اگر برنامه شما به ندرت به دسترسی تصادفی نیاز داشته باشد و بیشتر روی Traversal متوالی تمرکز کند ، یک لیست مرتبط ممکن است گزینه بهتری نسبت به یک بردار باشد.
نقشه B-Tree (BTreeMap
)
BTreeMap
یک مجموعه با ارزش کلیدی است که با استفاده از یک درخت B اجرا می شود. این کلیدها را به ترتیب مرتب شده نگه می دارد. در مقایسه با نقشه های هش (HashMap
) BTreeMap
در صورت سفارش کلیدها ، جستجوی محدوده یا مسافت های سفارش داده شده ، نیاز است.
use std::collections::BTreeMap;
fn main() {
// Create a new empty BTreeMap
let mut map: BTreeMap<String, i32> = BTreeMap::new();
// Insert key-value pairs into the BTreeMap
map.insert("apple".to_string(), 3);
map.insert("banana".to_string(), 2);
map.insert("pear".to_string(), 4);
// Retrieve the value corresponding to a key
if let Some(v) = map.get("apple") {
println!("apple: {}", v);
}
// Remove a key-value pair
map.remove("banana");
// Iterate over the BTreeMap
for (key, value) in &map {
println!("{}: {}", key, value);
}
// Range query: get all key-value pairs with keys between "apple" and "pear" (inclusive)
let range = map.range("apple".to_string()..="pear".to_string());
for (key, value) in range {
println!("Range query: {}: {}", key, value);
}
}
BTreeMap
گزینه خوبی است که به یک نقشه مرتب شده خودکار نیاز باشد ، به خصوص برای نمایش داده های محدوده و Traversal سفارش داده شده مفید است.
اگر برنامه شما به طور مکرر عملیات جستجوی ، درج و حذف را انجام می دهد که در آن کلیدها به طور طبیعی سفارش داده می شوند ، BTreeMap
می تواند مناسب تر از HashMap
همانطور که ترتیب کلیدها را حفظ می کند ، جستجوی محدوده محدوده را تسهیل می کند و از مسیر سفارش استفاده می کند.
مجموعه B-Tree (BTreeSet
)
BTreeSet
مجموعه ای است که بر اساس یک درخت B اجرا شده است. این عناصر منحصر به فرد را ذخیره می کند و آنها را به ترتیب مرتب نگه می دارد. در مقایسه با HashSet
با BTreeSet
پشتیبانی از عملیات سفارش داده شده و نمایش داده های محدوده اما ممکن است برای برخی از عملیات کندتر باشد.
use std::collections::BTreeSet;
fn main() {
// Create a new empty BTreeSet
let mut set: BTreeSet<i32> = BTreeSet::new();
// Add elements to the set
set.insert(12);
set.insert(5);
set.insert(18);
// Check if an element exists
if set.contains(&12) {
println!("Set contains 12");
}
// Remove an element
set.remove(&5);
// Iterate over the set (elements will be in ascending order)
for num in &set {
println!("{}", num);
}
// Range query: retrieve all elements greater than or equal to 10 and less than 20
for num in set.range(10..20) {
println!("Range query: {}", num);
}
}
BTreeSet
انتخاب خوبی است که برای جستجوی سریع ، پرس و جوهای دامنه یا Traversal سفارش داده شده به یک مجموعه سفارش داده شده نیاز دارید.
برای سناریوهایی که در آن عناصر منحصر به فرد باید ذخیره شوند مناسب است و عناصر دارای یک رابطه قابل مقایسه هستند.
پشته دودویی (BinaryHeap
)
BinaryHeap
اجرای یک صف اولویت بر اساس یک پشته باینری است. بسته به اینکه آیا این یک حداکثر یا مین است ، امکان قرار دادن سریع عناصر و حذف حداکثر (یا حداقل) عنصر را فراهم می کند. به طور پیش فرض ، Rust's BinaryHeap
حداکثر-حداکثر است.
use std::collections::BinaryHeap;
fn main() {
// Create a new empty BinaryHeap
let mut heap = BinaryHeap::new();
// Add elements to the heap
heap.push(1);
heap.push(5);
heap.push(2);
// Peek at the maximum element in the heap without removing it
if let Some(max) = heap.peek() {
println!("Max element: {}", max);
}
// Remove and return the maximum element
println!("Removed max element: {}", heap.pop().unwrap());
// Iterate over the heap (the order of iteration is not sorted)
for num in &heap {
println!("{}", num);
}
}
هنگامی که یک ساختار داده برای دسترسی سریع و حذف عنصر حداکثر (یا حداقل) لازم است ، BinaryHeap
ایده آل است این امر به ویژه در الگوریتم هایی مانند کوتاهترین مسیر Dijkstra مفید است.
BinaryHeap
برای برنامه ریزی کار ، الگوریتم های حریص یا هر سناریویی که نیاز به صف اولویت داشته باشد ، مناسب است.
ما Leapcell ، انتخاب برتر شما برای میزبانی پروژه های زنگ زدگی هستیم.
Leapcell بستر سرور نسل بعدی برای میزبانی وب ، کارهای ASYNC و REDIS است:
پشتیبانی چند زبانی
- با node.js ، پایتون ، برو یا زنگ زدگی توسعه دهید.
پروژه های نامحدود را به صورت رایگان مستقر کنید
- فقط برای استفاده پرداخت کنید – بدون درخواست ، بدون هزینه.
راندمان هزینه بی نظیر
- پرداخت به عنوان شما بدون هیچ گونه هزینه بیکار.
- مثال: 25 دلار از درخواست های 6.94M در زمان پاسخ متوسط 60ms پشتیبانی می کند.
تجربه توسعه دهنده ساده
- UI بصری برای راه اندازی بی دردسر.
- خطوط لوله CI/CD کاملاً خودکار و ادغام GITOPS.
- معیارهای زمان واقعی و ورود به سیستم برای بینش های عملی.
مقیاس پذیری بی دردسر و عملکرد بالا
- مقیاس خودکار برای رسیدگی به همزمانی بالا با سهولت.
- صفر سربار عملیاتی – فقط روی ساختمان تمرکز کنید.
در اسناد بیشتر کاوش کنید!
ما را در X دنبال کنید: LeapCellHQ
در وبلاگ ما بخوانید