Rust编写泛型冒泡排序出现expected T found &T等编译错误如何解决
问题解决方法
两个报错的原因和对应修复方案如下:
- 第一个
>运算符无法应用到T类型的报错:是因为泛型T没有约束可比较大小的特性,你已经按照提示添加了std::cmp::PartialOrd约束,这一步是正确的。 - 第二个类型不匹配报错:是你改写泛型代码时额外添加了不必要的
&引用符号,你试图将&T类型的引用赋值给存储T类型元素的数组位置,自然会触发类型错误。除此之外,你原来的手动交换临时变量的逻辑依赖类型实现Copy特性,需要额外添加约束,或者直接用更通用的swap方法替换手动交换逻辑。
版本1:保留原手动交换逻辑的正确代码
需要额外给T添加Copy约束,适配所有可复制的类型:
pub fn bubble_sort<T: std::cmp::PartialOrd + Copy>(mut arr: Vec<T>) -> Vec<T> { for i in 1..(arr.len() - 1) { for j in 0..(arr.len() - i) { if j == arr.len() - 1 { continue; } if arr[j] > arr[j + 1] { let buffer = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = buffer; } } } return arr; }
版本2:更通用的无Copy约束版本
直接调用Vec内置的swap方法交换元素位置,不需要手动写临时变量,也不需要Copy约束,兼容所有可比较大小的类型:
pub fn bubble_sort<T: std::cmp::PartialOrd>(mut arr: Vec<T>) -> Vec<T> { let len = arr.len(); // 优化循环边界避免空数组/短数组的边界问题 for i in 0..len { for j in 0..(len - 1 - i) { if arr[j] > arr[j + 1] { arr.swap(j, j + 1); } } } arr }
注:版本2同时修复了原代码循环边界的问题,长度小于3的数组也可以正常排序。
内容的提问来源于stack exchange,提问作者Divine Bicycle
相关产品推荐
相关产品推荐

