見出し画像

Rust コレクションとは 使い方と注意点について

今回はRustにおけるコレクションについて説明していきます。

コレクションとは

コレクション、データの集まりを管理するためのデータ構造です。

標準ライブラリでは、様々なコレクション型が提供されており、それぞれ特定の用途や性能特性を持っています。

代表的なコレクション型には、Vec、String、HashMap、HashSet、VecDeque、およびLinkedListがあります。


コレクションの使い方

Vec<T>

Vecは動的配列で、可変長の要素リストを格納します。要素の追加や削除が効率的に行えるように設計されています。

fn main() {
    let mut vec = Vec::new();
    vec.push(1);
    vec.push(2);
    vec.push(3);

    for elem in &vec {
        println!("{}", elem);
    }
}

String

Stringは可変長の文字列を格納するためのコレクションです。Rustの文字列はUTF-8エンコードされており、Unicode対応です。

fn main() {
    let mut s = String::new();
    s.push_str("Hello, ");
    s.push('W');
    s.push_str("orld!");

    println!("{}", s);
}

HashMap<K, V>

HashMapはキーと値のペアを格納するハッシュマップです。キーの検索や値の追加、削除が効率的に行えます。

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    map.insert("one", 1);
    map.insert("two", 2);
    map.insert("three", 3);

    if let Some(value) = map.get("two") {
        println!("The value for 'two' is {}", value);
    }
}

HashSet<T>

HashSetは一意の要素を格納するためのセットです。要素の追加、削除、存在確認が効率的に行えます。

use std::collections::HashSet;

fn main() {
    let mut set = HashSet::new();
    set.insert(1);
    set.insert(2);
    set.insert(3);

    if set.contains(&2) {
        println!("Set contains 2");
    }
}

VecDeque<T>

VecDequeは両端キューで両端からの要素の追加と削除が効率的に行えます。

use std::collections::VecDeque;

fn main() {
    let mut deque = VecDeque::new();
    deque.push_back(1);
    deque.push_back(2);
    deque.push_front(0);

    while let Some(elem) = deque.pop_front() {
        println!("{}", elem);
    }
}

LinkedList<T>

LinkedListは双方向連結リストです。両端からの要素の追加と削除が効率的に行えますが、ランダムアクセスは遅いです。

use std::collections::LinkedList;

fn main() {
    let mut list = LinkedList::new();
    list.push_back(1);
    list.push_back(2);
    list.push_front(0);

    for elem in &list {
        println!("{}", elem);
    }
}


コレクションの注意点

性能特性の理解

各コレクションには異なる性能特性があります。
Vecはランダムアクセスが高速ですが、LinkedListは挿入と削除が高速です。

所有権と借用

コレクションを使用する際には所有権と借用のルールを理解しておく必要があります。
特に、ashMapやHashSetは所有権を持つキーや値を格納するため、要素の追加や削除時に所有権の移動が発生します。

スレッドセーフ

標準のコレクションはスレッドセーフではありません。スレッド間で共有する場合には、Arc<Mutex<T>>やRwLock<T>などのスレッドセーフなラッパーを使用する必要があります。


Rustをもっと詳しくなりたい方に

Rustプログラミング完全ガイド 他言語との比較で違いが分かる!

個人的には他の言語開発もそれなりにあったことからこの本を読むことでかなりRustへの理解が深まりました。

プログラムやシステム的な専門用語は当たり前に登場するものの、他の言語での開発経験がある方なら問題ないでしょう。むしろその経験があることで、多言語との比較をしながら読み進めることができます。

内容的には大容量かつ丁寧すぎるほど嚙み砕いて説明がされているため、情報量は十分といえます。Rust自体学習コストが高く、難易度の高い言語のためこのくらいが妥当といえます。

プログラミング初心者レベルの方には難しい内容となっていますが、Rustの概念を理解し、基礎を把握することができる本であること間違いなしです。

Rust学習のために筆者が実際に読んでおすすめしたい本をまとめています。


基礎から学ぶRustプログラミング入門

本コースではRustについて全く経験がない方でもスムーズに学習を進められるようにとなっています。
基本的にはコードベースで解説を行い、抽象度が高く難しい内容に関しては適宜スライドも使いながら丁寧に解説します。そしてただ文法を学ぶだけではなく、最終的には演習としてCLIアプリケーションを作成し学習内容の定着を図ります。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています


この記事が参加している募集

この経験に学べ

この記事が気に入ったらサポートをしてみませんか?