在 Rust 中拥有多个链表并在它们之间移动数据的正确方法是什么?
What is the right way to have multiple linked lists and move data between them in Rust?
拥有多个 std::collections::LinkedList
的正确方法是什么,其中这些列表的数量在编译时是未知的?
我正在用数据填充它们并合并它们(例如使用 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
的可变引用。我也尝试使用 Vec<&mut LinkedList<i32>>
,但没有成功。
解决这个问题的正确方法是什么?
没有正确的方法。一种可能性是使用 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);
}
参见:
- 等等
大多数集合都有一个 iter_mut
方法,该方法 returns 一个迭代器,它产生对集合中每个项目的可变引用。而且这些引用都可以同时使用! (但引用必须来自同一个迭代器;您不能同时使用来自对 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();
}
拥有多个 std::collections::LinkedList
的正确方法是什么,其中这些列表的数量在编译时是未知的?
我正在用数据填充它们并合并它们(例如使用 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
的可变引用。我也尝试使用 Vec<&mut LinkedList<i32>>
,但没有成功。
解决这个问题的正确方法是什么?
没有正确的方法。一种可能性是使用 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);
}
参见:
- 等等
大多数集合都有一个 iter_mut
方法,该方法 returns 一个迭代器,它产生对集合中每个项目的可变引用。而且这些引用都可以同时使用! (但引用必须来自同一个迭代器;您不能同时使用来自对 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();
}