有没有一种本地方法来判断一个切片是否有重复项?现在,我用这个:

fn has_dup<T: PartialEq>(slice: &[T]) -> bool {
    for i in 1..slice.len() {
        if slice[i..].contains(&slice[i - 1]) {
            return true;
        }
    }
    false
}

fn main() {
    assert_eq!(has_dup(&[1, 2, 3, 2, 5, 6]), true);
    assert_eq!(has_dup(&[1, 2, 3, 4, 5, 6]), false);
}

但对于这种基本操作,我不喜欢使用手工编写的代码.

如果标准库中没有可用的函数来执行此操作,这是优化代码的一种方法吗?我知道索引切片并不是最优化的方式(for i in slice {}for i in 0..slice.len() { slice[i] }).

推荐答案

就算法复杂性而言,通常最好跟踪索引中的唯一值.如果可以使用HashEq判断相等性,可以try 以下实用程序功能:

fn has_unique_elements<T>(iter: T) -> bool
where
    T: IntoIterator,
    T::Item: Eq + Hash,
{
    let mut uniq = HashSet::new();
    iter.into_iter().all(move |x| uniq.insert(x))
}

assert!(!has_unique_elements(vec![10, 20, 30, 10, 50]));
assert!(has_unique_elements(vec![10, 20, 30, 40, 50]));
assert!(has_unique_elements(Vec::<u8>::new()));

Playground

同样,如果您的元素没有实现Hash,但是实现了Ord,那么可以使用BTreeSet来代替(Playground).

Rust相关问答推荐

使用windows crate Rust 展示windows

为什么父作用域中的变量超出了子作用域

包含嵌套 struct 的CSV

通过解引用将值移出Box(以及它被脱糖到什么地方)?

闭包不会发送,即使它只捕获发送变量

在本例中,为什么我不能一次多次borrow 可变变量?

将Vec<;U8&>转换为Vec<;{Float}&>

为什么&;mut buf[0..buf.len()]会触发一个可变/不可变的borrow 错误?

`actix-web` 使用提供的 `tokio` 运行时有何用途?

Rust 中什么时候可以返回函数生成的字符串切片&str?

Rust 文件未编译到 dll 中

Rust编译器通过哪些规则来确保锁被释放?

(let b = MyBox(5 as *const u8); &b; ) 和 (let b = &MyBox(5 as *const u8); ) 之间有什么区别

了解 Rust 闭包:为什么它们持续持有可变引用?

Rust/Serde/HTTP:序列化`Option`

为什么我不能克隆可克隆构造函数的Vec?

在 RefCell 上borrow

使用 `.` 将 T 转换为 &mut T?

TinyVec 如何与 Vec 大小相同?

为什么我可以在没有生命周期问题的情况下内联调用 iter 和 collect?