如何将iter.next()转换为数组索引?

时间:2018-04-14 02:44:25

标签: arrays rust breadth-first-search

我会实现一个数组v来将当前顶点标记为已访问。但是,iter.next()不能是LinkedList的索引或数组的索引。

  1. iter.next()的输出不是整数,而是Some选项。
  2. 如何使用Some中的值?如果我将Some中的值用作数组的索引。我应该将值转换为整数吗?
  3. 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);
    }
    

4 个答案:

答案 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)
    }
    …