我会实现一个数组v
来将当前顶点标记为已访问。但是,iter.next()
不能是LinkedList
的索引或数组的索引。
iter.next()
的输出不是整数,而是Some
选项。Some
中的值?如果我将Some
中的值用作数组的索引。我应该将值转换为整数吗?fn bfs(s: usize) {
let mut cells = vec![LinkedList::<usize>::new(); 4];
for (i, cell) in cells.iter_mut().enumerate() {
cell.push_front(i);
}
cells[0].push_back(1);
cells[0].push_back(2);
cells[1].push_back(2);
cells[2].push_back(0);
cells[2].push_back(3);
cells[3].push_back(3);
let mut iter = cells[s].iter();
let mut v = vec![0; 4];
// Entry point
for i in 0..cells[s].len() {
// It is incorrect, "iter.next()" it cannot be a index of LinkedList
// vector "v" to keep track of which vertex has been traversed
//v[iter.next()] = 1;
}
}
fn main() {
bfs(2);
}
答案 0 :(得分:3)
iter.next()
返回Option
,您只需要解构它:
for i in 0..cells[s].len() {
let x = match iter.next() {
Some(x) => *x,
None => return,
};
v[x] = 1;
}
答案 1 :(得分:2)
Rust的for
循环可以为您迭代,因此您不需要显式创建迭代器或调用next()
。 Option
已经在循环中解包,因为当next()
返回None
时,循环会自动结束。
for &i in &cells[s] {
v[i] = 1;
}
这样可以节省您只需创建循环即可跟踪索引变量。而且代码更短,更易读。
答案 2 :(得分:0)
这是最终版本
fn bfs(s: usize) {
let mut cells = vec![LinkedList::<usize>::new(); 4];
let mut traversal = LinkedList::new();
let mut queue = LinkedList::new();
for (i, cell) in cells.iter_mut().enumerate() {
cell.push_front(i);
}
cells[0].push_back(1);
cells[0].push_back(2);
cells[1].push_back(2);
cells[2].push_back(0);
cells[2].push_back(3);
cells[3].push_back(3);
let mut v = vec![0; 4];
let mut done = false;
let c = s;
while !done {
for &x in &cells[c] {
if v[x] == 0 {
v[x] = 1;
queue.push_back(x);
traversal.push_back(x)
}
}
let c = queue.pop_back();
if queue.is_empty() {
// walkthrough
for i in 0..cells.len() {
if v[i] == 0 {
v[i] = 1;
queue.push_back(i);
traversal.push_back(i)
}
}
if queue.is_empty() {
done = true;
}
}
}
println!("{:?}", traversal);
}
答案 3 :(得分:0)
您可以使用 Some
中整数值的引用作为数组的索引。
let mut v = vec![0; 4];
while !done {
let mut iter = cells[c].iter().peekable();
// Entry point
while let Some(&x) = iter.next_if(|&&n| v[n] == 0) {
v[x] = 1;
queue.push_back(x);
traversal.push_back(x)
}
…