از بردارها گرفته تا هاشست: پیمایش ساختارهای داده 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
در وبلاگ ما بخوانید



