gpt4 book ai didi

rust - 有条件地在Rust中对Vec进行排序

转载 作者:行者123 更新时间:2023-12-03 11:41:30 24 4
gpt4 key购买 nike

假设我要对Vec的非克隆项进行排序-但只有这样(这是我代码中问题的精简示例)。
我的尝试将是这样的:

fn maybe_sort<T>(x: Vec<T>) -> Vec<T>
where
T: std::cmp::Ord,
{
// First, I need a copy of the vector - but only the vector, not the items inside
let mut copied = x.iter().collect::<Vec<_>>();
copied.sort();
// In my actual code the line below depends on the sorted vec
if rand::random() {
return copied.into_iter().map(|x| *x).collect::<Vec<_>>();
} else {
return x;
}
}
las,借阅检查员不满意。我对Vec中的每个项目都有一个共享的引用,尽管我从未返回同一项目的2个引用,但Rust无法分辨。
没有 unsafe,有没有办法做到这一点? (如果没有,使用 unsafe进行清理的最干净的方法是什么?

最佳答案

您可以.enumerate()这些值以保留其原始索引。您可以根据其值T对其进行排序,并决定是返回已排序的版本,还是通过按原始索引进行排序来反转排序。

fn maybe_sort<T: Ord>(x: Vec<T>) -> Vec<T> {
let mut items: Vec<_> = x.into_iter().enumerate().collect();
items.sort_by(|(_, a), (_, b)| a.cmp(b));

if rand::random() {
// return items in current order
}
else {
// undo the sort
items.sort_by_key(|(index, _)| *index);
}

items.into_iter().map(|(_, value)| value).collect()
}

关于rust - 有条件地在Rust中对Vec进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65280443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com