带有切片索引的Itertools和函数之间的Rust矢量类型转换/接口问题



目标:并行生成排列和索引。

尝试:使用Itertools将所有排列分配给结果向量,然后使用rayon处理每个排列。

最小可复制代码:

use rayon::iter::ParallelIterator;
use rayon::iter::IntoParallelIterator;
use itertools::Itertools;
fn main() {
let data: Vec<u128> = [0, 1, 2, 3, 4, 5, 6].to_vec();
let k = 4;
let vector = data.into_iter().permutations(k).map_into::<Vec<u128>> 
().collect_vec();
(vector).into_par_iter().for_each(move |x| index_vec(x));
}
fn index_vec(i: Vec<u128>) -> () {
let mut colour_code: String = String::from("");
let mut index_position = 0;
for _ in 0..4 {
colour_code.push_str(COLOURS[i[index_position]]);
colour_code.push(' ');
index_position += 1;
}
println!("Colour code: {}", colour_code);
}
const COLOURS: [&str; 7] = [
"red", "yellow", "blue", "green", "pink", "grey", "orange",
];

错误:切片索引的类型为usize或范围为usize

然而,如果我将所有向量更改为类型usize,那么Itertools会在map_into方法上抛出一个错误:特性From<Vec<u128>>没有为Vec<usize>实现。

如何使Itertools和slice索引协同工作?

要编译并运行发布的代码,只需将u128转换为用于索引数组的usize

我认为这是";"安全";目前,由于没有指针大小>128字节,据我所知。然而,请注意,这种转换在理论上可能会失败

所以固定代码看起来是这样的:

use rayon::iter::ParallelIterator;
use rayon::iter::IntoParallelIterator;
use itertools::Itertools;
fn main() {
let data: Vec<u128> = [0, 1, 2, 3, 4, 5, 6].to_vec();
let k = 4;
let vector = data.into_iter().permutations(k).map_into::<Vec<u128>> 
().collect_vec();
(vector).into_par_iter().for_each(move |x| index_vec(x));
}
fn index_vec(i: Vec<u128>) -> () {
let mut colour_code: String = String::from("");
let mut index_position = 0;
for _ in 0..4 {
colour_code.push_str(COLOURS[i[index_position] as usize]);
colour_code.push(' ');
index_position += 1;
}
println!("Colour code: {}", colour_code);
}
const COLOURS: [&str; 7] = [
"red", "yellow", "blue", "green", "pink", "grey", "orange",
];

游乐场链接在这里。

相关内容

  • 没有找到相关文章

最新更新