さびのベクトル


私は正直になります:私は最初に錆で利用可能なすべてのコレクションだけでなく、関連する概念を記述したい.それから、私は少しそれを掘り始めました、そして、私はそれがあまりに長い間あったと決めました.そのために、範囲を制限しますVec 種類
ここにダイブするダイアグラムです.

ベクターの基礎


からdocumentation :

A contiguous growable array type, written as Vec<T> and pronounced 'vector'.


Javaと同じようにArrayList , Vec を配列で返します.配列が満杯に達するとVec より多くの容量とコピー要素を元の配列から新しく作成したものにコピーします.そして前者を解放する.コレクションは頻繁に再配置を避けるために必要以上の配列を割り当てることができます.
値をVec , 追加のステップを使用する必要がありますpush() 機能
let mut v = Vec::new();
v.push(1);
v.push(5);
新規作成する関数Vec アイテムを初期化します.を作成する場合Vec そして同時に、ルストはvec! マクロ.上記のコードを次の1つのライナーで置き換えることができます.
let v = vec![1, 5];
その時点で、すでに錆でビットをつまんでいる場合は、おそらく何も新しいことを学んだ.すべての機能を記述する代わりにVec - 彼らは、他の言語で見つけられたものとかなり類似しています-少しまわりを調査しましょう.

ベクトルとイテレータ


イテレータは、古典的なデザインパターンで記述されたデザインパターンです:再利用可能なオブジェクト指向ソフトウェアブックの要素

Intent: Provide an object which traverses some aggregate structure, abstracting away assumptions about the implementation of that structure.

-- Iterator pattern


本はイテレータを記述しますが、何もパターンをOOP言語に制限します.それはかなり広範な抽象化です.
錆はIterator 特性Vec 実装します.したがって、その値を横断できます.
let v = vec![1, 5];
let mut iter = v.iter();                       // 1
loop {
    let value = iter.next();                   // 2
    if value.is_some() {
        println!("value: {}", value.unwrap());
    } else {
        break;
    }
}
  • イテレータを作成します.呼び出すからnext() の状態を変更するiter , それは可能です.
  • 次の値を得る
  • 私が誤ったものから生じている各々のバグのためにドルを受け取ったならばbreak ステートメント、私は確かに今金持ちになります.あまりにも早く休憩する場合は、値を失う;あまりにも遅く、すべての地獄が緩んでいる.そのためにfor イテレータとともに、より良い合うものです.上記のコードを書き換えることができます.
    let v = vec![1, 5];
    for value in v.iter() {                        // 1
        println!("value: {}", value);
    }
    
  • より短く,より安全に,よりよい
  • イテレータからの反復子の多過ぎる


    興味深いことに、私たちは、上記のコードをわずかに変えることができますiter() . それはまだ動作します!
    let v = vec![1, 5];
    for value in v {                               // 1
        println!("value: {}", value);
    }
    
  • マジック!
  • それは実際に魔法ではなく、アクションの中で錆'構文上の砂糖です.for ループは反復子を受け入れる.しかし、いくつかのインスタンスは“オンザフライで”イテレータに変換することができます.型はIntoIterator 形質とそのITSinto_iter() 対象となる関数.上の図からわかるように、それはVec .
    あなた自身の違いを尋ねるならばiter() and into_inter() , 私が同様に思ったという事実で慰めてください.
    いくつかの研究の後、私はこの素晴らしい答えを見つけた

    TL;DR:

    • The iterator returned by into_iter may yield any of T, &T or &mut T, depending on the context.
    • The iterator returned by iter will yield &T, by convention.
    • The iterator returned by iter_mut will yield &mut T, by convention.

    -- What is the difference between iter and into_iter?


    最後に、あなたはVec からIterator ありがとうFromIterator .
    struct Foo {
        count: u8
    }
    
    impl Iterator for Foo {                           // 1
        type Item = u8;
        fn next(&mut self) -> Option<Self::Item> {
            match self.count {
                0 => {
                    self.count = self.count + 1;
                    Option::Some(1)                   // 2
                }
                1 => {
                    self.count = self.count + 1;
                    Option::Some(5)                   // 2
                }
                _ => None                             // 2
            }
        }
    }
    
    let i = Foo { count: 0 };
    let v = Vec::from_iter(i);                        // 3
    for value in v {
        println!("value: {}", value);
    }
    
  • 自分自身を実装Iterator
  • 第一、復帰1 , then 5 , 其れ無し
  • クリエイトアVec イテレータから
  • メモリ割り当て


    我々は1つの側面を見落としたVec これまでのところ、定義は実際ですVec<T, A: Allocator = Global> . 中T は、Vec 含む、我々は見なかったA , これはメモリを割り当てるものです.私は現在、関連する知識が不足しているので、主題を詳細に説明しません.しかし、私はそれについて言及するのが面白いと思います.

    An implementation of Allocator can allocate, grow, shrink, and deallocate arbitrary blocks of data described via Layout.

    -- std::alloc::Allocator



    錆はGlobal デフォルトのメモリ割り当て.それは別のアロケータに委任しますSystem を登録しない限り#[global_allocator] 属性.
    With Vec<T, A> , したがって、中央で定義されたものより異なるアロケータを使用することが可能です.つの可能なユースケースは、割り当てられたバイトをVec インスタンス.

    結論


    これは、私のVec . このポストでは、私はこの種のポストの通常の取扱いを避けて、少しまわりを調査しようとしました.専用のメモリアロケータはほとんどの場合に必要ではありませんが、私はそれが良い場合に念頭に置いて良いトリックだと思う.
    さらに進む
  • Module std::collections
  • Storing Lists of Values with Vectors
  • Struct std::vec::Vec
  • What is the difference between iter and into_iter?
  • 当初公開A Java Geek 2021年8月8日