2017-02-03 27 views
2

有多個std::collections::LinkedList s的正確方法是什麼?這些列表的數量在編譯時是未知的嗎?在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

沒有正確方法。一種可能性是使用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

大多數集合都有一個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(); 
} 

還記得,迭代器有nth方法在一個循環做的next相當於。

相關問題