2017-02-03 6 views
2

std::collections::LinkedList複数のリストをコンパイルするときにそれらのリストの番号が不明な場合はどうすればよいですか?複数のリンクリストを作成し、それらの間でRustでデータを移動する正しい方法は何ですか?

データを入力してマージする(例:append()を使用)。 私は、それらのリストを含むベクトルを持つことが良いと思ったり、それらのリストへの参照を含んでいます。

私は次のことを試してみました:

use std::collections::LinkedList; 

fn listtest() { 
    let mut v: Vec<LinkedList<i32>> = Vec::new(); 
    v.push(LinkedList::new()); // first list 
    v.push(LinkedList::new()); // second list 
    v[0].push_back(1); // fill with data 
    v[1].push_back(3); // fill with data 
    v[0].append(&mut v[1]); // merge lists 
} 

fn main() { 
    listtest(); 
} 

これはappend()を使用しているとき、私はvの2つの可変の参照を持っているので、コンパイルに失敗しました。私もVec<&mut LinkedList<i32>>を使ってみましたが、成功しませんでした。

この問題にはどのようなアプローチが適していますか?

答えて

5

のアプローチはありません。 1つの可能性は、split_at_mutを使用することです。

use std::collections::LinkedList; 

fn main() { 
    let mut v = vec![LinkedList::new(), LinkedList::new()]; 
    v[0].push_back(1); 
    v[1].push_back(3); 

    { 
     let (head, tail) = v.split_at_mut(1); 
     head[0].append(&mut tail[0]); 
    } 

    println!("{:?}", v); 
} 

参照:

これは、他とは別個に突然変異させることができ、それぞれが2つの別個のスライスを作成します
2

ほとんどのコレクションには、コレクションの各アイテムへの変更可能な参照を生成するイテレータを返すiter_mutメソッドがあります。これらの参照はすべて同時に使用できます。 (しかし、参照は、同じイテレータから来なければならない。あなたが同時にiter_mutに別々の呼び出しからの参照を使用することはできません。)また

use std::collections::LinkedList; 

fn listtest() { 
    let mut v: Vec<LinkedList<i32>> = Vec::new(); 
    v.push(LinkedList::new()); // first list 
    v.push(LinkedList::new()); // second list 
    v[0].push_back(1); // fill with data 
    v[1].push_back(3); // fill with data 
    let mut vi = v.iter_mut(); 
    let first = vi.next().unwrap(); 
    let second = vi.next().unwrap(); 
    first.append(second); // merge lists 
} 

fn main() { 
    listtest(); 
} 

をループでnextと同等のものを行うためのイテレータはnthメソッドを持っていることを覚えておいてください。

関連する問題