gpt4 book ai didi

rust - 从 HashMap 获取拥有值的 Vec

转载 作者:行者123 更新时间:2023-11-29 08:17:36 26 4
gpt4 key购买 nike

我写的一个算法构建了一个临时的 HashMap .完成后,我只对 values 感兴趣的 HashMap ,所以我想从 HashMap<K, V> 转移值的所有权到 Vec<V> .

使用一个简化的示例 hashmap:

fn main() {
use std::collections::HashMap;
let mut h: HashMap<_, _> = HashMap::new();
h.insert(1, "foo".to_owned());
}

我能做到:

  • let vals: Vec<&String> = h.values().collect(); - 简短而贴心,但 HashMap 仍然拥有这些值;
  • let vals: Vec<String> = h.values().cloned().collect() (如 this question )- 结果是我需要的,但我被教导要避免额外的克隆;
  • let vals: Vec<String> = h.into_iter().map(|(_k, v)| v).collect(); - 无需克隆即可完成我需要的操作,但有点难看。

实际值是一个中等大小的结构( {String, Vec<String>} ,总共不到 KB)。

我应该默认避免 clone 吗?在这种情况下还是过早优化?有没有我缺少的惯用方法?

最佳答案

.into_iter().map(|(_, v)| v) 是惯用的方法。那一点都不丑。

如果你愿意,你可以这样做:

use std::collections::hash_map;
use std::collections::HashMap;
use std::iter::{ExactSizeIterator, FusedIterator};

struct IntoValues<K, V> {
iter: hash_map::IntoIter<K, V>,
}

impl<K, V> IntoValues<K, V> {
fn new(map: HashMap<K, V>) -> Self {
Self {
iter: map.into_iter(),
}
}
}

impl<K, V> Iterator for IntoValues<K, V> {
type Item = V;

fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|(_, v)| v)
}

fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
}
impl<K, V> ExactSizeIterator for IntoValues<K, V> {}

impl<K, V> FusedIterator for IntoValues<K, V> {}

trait HashMapTool {
type IntoValues;
type Item;
fn into_values(self) -> Self::IntoValues;
}

impl<K, V> HashMapTool for HashMap<K, V> {
type Item = V;
type IntoValues = IntoValues<K, V>;
fn into_values(self) -> Self::IntoValues {
IntoValues::new(self)
}
}

fn main() {
let mut h: HashMap<_, _> = HashMap::new();
h.insert(1, "foo".to_owned());

let _vals: Vec<_> = h.into_values().collect();
}

关于rust - 从 HashMap 获取拥有值的 Vec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57438461/

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