迭代器中元素的向量

问题描述 投票:0回答:1

首先,我对 Rust 没有太多经验,所以我可能误解了一些观点。我正在尝试创建一个对象(结构)来迭代迭代器中元素的组合。我需要在结构中存储迭代器元素的引用,但我无法弄清楚如何做到这一点。这是我的代码:


pub struct Combination<'a, T: Iterator> {
    _obj_items_: Vec<&'a T::Item>,
    _com_: Vec<usize>,
}

impl<'a, T: Iterator> Combination<'a, T> {
    pub fn new (_obj_: &'a mut T, many: usize) -> Combination<'a, T> {
        let mut r = Combination::<'a, T> {
            _obj_items_ : Vec::<&'a T::Item>::with_capacity(_obj_.by_ref().count()),
            _com_ : Vec::<usize>::with_capacity(many),
        };

        r._com_.append(&mut (0..many).collect());

        /* filling vector with _obj_ elements. */
        for e in _obj_.by_ref() {
            r._obj_items_.push(&e);
        }

        r
    }
}

我的想法是,当我制作

_obj_.by_ref()
(在注释下方的循环中)时,它将迭代迭代器的元素,但我认为它正在迭代包含元素的迭代器的项目。我对吗?如何使我的代码正确存储实际元素的引用?

rust
1个回答
0
投票

调用

_obj_.by_ref()
会创建对原始迭代器的新引用,但不会消耗迭代器的元素。它允许您可变地借用迭代器并在多个地方使用它而无需消耗。

您的问题是尝试将迭代器项的引用存储在向量中,一旦迭代器被消耗或修改,这些引用就会失效,因为迭代器可能会在迭代期间移动其内部状态或修改其元素。

您应该存储项目本身,您可以通过将项目收集到向量中来做到这一点。

pub struct Combination<T: Iterator> {
    _obj_items_: Vec<T::Item>,
    _com_: Vec<usize>,
}

impl<T: Iterator> Combination<T> {
    pub fn new(_obj_: T, many: usize) -> Combination<T> {
        let mut r = Combination {
            _obj_items_: _obj_.collect(),
            _com_: (0..many).collect(),
        };

        r
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.