برنامه نویسی

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

مقیاس پذیری بی دردسر و عملکرد بالا

  • مقیاس خودکار برای رسیدگی به همزمانی بالا با سهولت.
  • صفر سربار عملیاتی – فقط روی ساختمان تمرکز کنید.

در اسناد بیشتر کاوش کنید!

Leapcell را امتحان کنید

ما را در X دنبال کنید: LeapCellHQ


در وبلاگ ما بخوانید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا