vector - 从 Rust 中的向量构建 HashSet

标签 vector rust hashset

我想构建一个 HashSet<u8>来自Vec<u8> .我想做这个

  1. 一行代码,
  2. 只复制一次数据,
  3. 仅使用 2n内存,

但我唯一能编译的就是这段..垃圾,我认为它复制了两次数据并使用了3n。内存。

fn vec_to_set(vec: Vec<u8>) -> HashSet<u8> {
    let mut victim = vec.clone();
    let x: HashSet<u8> = victim.drain(..).collect();
    return x;
}

我希望写一些简单的东西,像这样:

fn vec_to_set(vec: Vec<u8>) -> HashSet<u8> {
    return HashSet::from_iter(vec.iter());
}

但这不会编译:

error[E0308]: mismatched types
 --> <anon>:5:12
  |
5 |     return HashSet::from_iter(vec.iter());
  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected u8, found &u8
  |
  = note: expected type `std::collections::HashSet<u8>`
  = note:    found type `std::collections::HashSet<&u8, _>`

.. 我不太理解错误消息,可能是因为我需要 RTFM。

最佳答案

因为操作不需要消耗向量¹,我认为它不应该消耗它。这只会导致程序中其他地方的额外复制:

use std::collections::HashSet;
use std::iter::FromIterator;

fn hashset(data: &[u8]) -> HashSet<u8> {
    HashSet::from_iter(data.iter().cloned())
}

hashset(&v) 一样调用它其中 vVec<u8>或其他强制切片的东西。

当然有更多的方式来写这个,通用等等,但这个答案坚持只介绍我想关注的事情。

¹这是基于元素类型 u8Copy ,即它没有所有权语义。

关于vector - 从 Rust 中的向量构建 HashSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39803237/

相关文章:

r - 如何从向量中删除某些项目?

c++ - find() STL 算法...我做错了什么?

c++ - Visual C++ parallel_for + vector 访问冲突

c# - 将文本绘制到png文件上的性能方法?

java - HashSet的统计

java - 为什么 HashMap 比 HashSet 快?

c++ - 将具有 vector 成员的数据结构写入二进制文件

process - 如何在 Rust 中终止 Windows 上正在运行的子进程?

rust - 元组结构有哪些用例?

Java的hashSet处理具有相同哈希码的多个项目