Vector 为什么我会得到;预期u32,发现&;{integer}";当使用置换器板条箱中的迭代器推入向量时?

Vector 为什么我会得到;预期u32,发现&;{integer}";当使用置换器板条箱中的迭代器推入向量时?,vector,types,rust,slice,Vector,Types,Rust,Slice,我想创建一个函数,返回一个数据结构,其中包含某组数字的所有可能组合:例如:for[1,2,3]返回[1]、[2]、[3]、[1,2]、[2,1]、[1,2,3]、[2,1,3]、[3,2,1] 我知道c和p是&integer的某种向量,但我找不到将它们保存到数组或向量中的方法。我试图将其保存为向量向量,因为我认为不可能将它们保存为数组向量,因为数组的大小不同。作为向量数组也是不可能的,因为我不知道开始时的组合数 如何将所有c和p存储在数据结构中,以便返回并在外部使用 use permutator

我想创建一个函数,返回一个数据结构,其中包含某组数字的所有可能组合:例如:for
[1,2,3]
返回
[1]、[2]、[3]、[1,2]、[2,1]、[1,2,3]、[2,1,3]、[3,2,1]

我知道
c
p
&integer
的某种向量,但我找不到将它们保存到数组或向量中的方法。我试图将其保存为向量向量,因为我认为不可能将它们保存为数组向量,因为数组的大小不同。作为向量数组也是不可能的,因为我不知道开始时的组合数

如何将所有
c
p
存储在数据结构中,以便返回并在外部使用

use permutator::{Combination, Permutation}; // 0.3.3

pub fn init() -> Vec<Vec<u32>> {
    let actions: Vec<Vec<u32>>;
    let mut data = &[1, 2, 3];
    let mut counter = 1;
    for i in 1..=data.len() {
        data.combination(i).for_each(|mut c| {
            println!("{:?}", c);
            actions.push(c);
            c.permutation().for_each(|p| {
                println!("k-perm@{} = {:?}", counter, p);
                counter += 1;
                actions.push(p);
            });
        });
    }
    actions
}

我已经找到了一个解决这个问题的方法,这个方法非常难看,但因为我对这门语言还不熟悉,所以这是我能想到的最好的方法

主要问题似乎是我有一个整数引用向量,而不是整数向量,所以我用一个临时变量对它进行了更改:

            let mut temp:Vec<u32> = vec![];
            for z in c.iter(){
                temp.push(**z);
            }
            actions.push(temp);
让mut temp:Vec=Vec![];
对于c.iter()中的z{
温度推力(**z);
}
动作。推(临时);
尝试
actions.push(c.iter().cloned().collect())
时返回以下错误

这是因为
c
是一个
Vec
,并且
.iter()
迭代对项目的引用,因此
c.iter()
和&u32
s的迭代器
.cloned()
删除其中一个
&
但不删除第二个。您可以通过添加另一个
.cloned()
(或
.copied()
)来修复此问题,但我更喜欢使用
.map

actions.push(c.iter().map(|c| **c).collect());
如果不需要保留引用,可以使用
Vec
c
进行阴影处理,以便在循环内使用:

let c: Vec<u32> = c.into_iter().cloned().collect();

actions.push(p)
在没有
的情况下可以在这里工作。into iter().cloned().collect()
因为
permutator::HeapPermutationIterator
在内部进行克隆。

很难回答您的问题,因为它没有包含一个。我们不知道
置换
组合
等方法是什么。也许你可以把它们去掉?如果您试图重现您的错误(如果可能的话),或者在全新的货运项目中,那么我们将更容易帮助您,然后您的问题将包括附加信息。您可以使用以下方法减少在此处发布的原始代码。谢谢这是一个库,我忘了包含它。如果您可以将问题最小化,请不要包含它。请粘贴您得到的准确和完整的错误-这将帮助我们了解问题是什么,以便我们能够提供最好的帮助。有时,试图解释错误消息是很棘手的,事实上,错误消息的另一部分很重要。看起来你只需要告诉编译器确切的类型。如果有人有更好的方法,请随时回答。最初的问题有点过于复杂,如果mods认为这太令人困惑,请随意关闭/删除帖子。感谢您的详细描述。我只是不得不使用actions.push(c.clone)来代替,因为c在“推送”中移动后,在“第三个for”中被借用。这里的for和for的区别是什么?因为在rust中,您可以始终使用for来迭代任何iterable,对吗?我使用for_是因为它出现在这个库的一些代码示例中。啊,对不起,我没有测试这个,因为我在工作。添加了
克隆()
。如果
操作的顺序不重要,您也可以移动
操作。将(c)
推到
for
循环的第三个
之后,以避免必须克隆它。y{…}
中的x的
y之间没有语义上的区别但是因为第一个是专用语法,视觉噪音更小,所以我更喜欢使用它
for_each
从技术上讲在某些情况下性能更高(),但它还有其他折衷办法,因此我建议您通常使用
for
并仅在
for
由于某种原因速度慢或难看时才使用
for_each
let c: Vec<u32> = c.into_iter().cloned().collect();
pub fn init() -> Vec<Vec<u32>> {
    let actions: Vec<Vec<u32>>;
    let data = &[1, 2, 3];
    let mut counter = 1;
    for i in 1..=data.len() {
        for c in data.combination(i) {
            let mut c = c.into_iter().cloned().collect();
            println!("{:?}", c);
            actions.push(c.clone());
            for p in c.permutation() {
                println!("k-perm@{} = {:?}", counter, p);
                counter += 1;
                actions.push(p);
            }
        }
    }
    actions
}