我正在尝试将矩阵A转换为矩阵B,其中B_11将成为元组中第一行的最大元素,第二行的最小元素。因此矩阵[1,2; 3,4]将变为[(2,1),(2,2); (4,1),(4,2)]。
pub fn find_saddle_points(input: &[Vec<u64>]) -> Vec<(usize, usize)> {
let answer = Vec::new();
println!("matrix: {:?}", input);
let x: Vec<Vec<_>> = input
.iter()
.map(|row| {
row.iter()
.map(move |_| {
let y = get_column(&input, 0);
println!("y is {:?}", y);
let x = get_lowest(&y);
(get_highest(row), x)
}).collect()
}).collect();
println!("x is {:?}", x);
answer
}
fn get_highest(row: &Vec<u64>) -> &u64 {
row.iter().max().unwrap()
}
fn get_lowest(column: &Vec<u64>) -> &u64 {
column.iter().min().unwrap()
}
fn get_column(matrix: &[Vec<u64>], index: usize) -> Vec<u64> {
matrix.iter().map(|row| row[index]).collect()
}
尝试使用y
时收到错误消息:
error[E0597]: `y` does not live long enough
--> src/lib.rs:11:41
|
11 | let x = get_lowest(&y);
| ^ borrowed value does not live long enough
12 | (get_highest(row), x)
13 | }).collect()
| - `y` dropped here while still borrowed
...
17 | }
| - borrowed value needs to live until here
我不明白为什么值y
必须一直使用到使用之后。生存到get_lowest
函数之后还不够吗?
我该如何解决?
答案 0 :(得分:0)
Shepmaster解释得很好
TL; DR-创建了Vec y,然后获得了对向量的引用 通过get_highest和get_lowest。退出封包时,Vec是 销毁,引用将一无所获。编译器是 防止您犯可能导致记忆的重大错误 像C或C ++这样的语言是不安全的。
答案 1 :(得分:0)
您可以使用clone()
函数将向量的新副本传递给函数get_highest
和get_lowest
,并使函数返回整数,而不返回带有函数{{1}的引用}。
to_owned()
正如@shepmaster所说,您应该避免将Vector的引用用作函数参数。