#rust
#Ржавчина
Вопрос:
Я говорю о std::collections::hash_map::Values
структуре, которую вы получаете при вызове .values()
метода HashMap
в. Эта структура действительно меня смущает, как я могу получить доступ к ее значениям, не перебирая их? Я хочу превратить эти значения в BinaryHeap
примерно так:
let heap = BinaryHeap::from(map.values());
Я прочитал документацию, и кажется, что у этой структуры на самом деле нет простого способа доступа к ее элементам
Комментарии:
1. Вы действительно имеете в виду «Как я могу преобразовать итератор в вектор»?
2. @tadman, я попробовал следующее:
let v: Vec<i32> = map.values().into_iter().collect();
но это не сработало, выдало мне ошибку, котораяstd::vec::Vec<i32>
не может быть собрана из итератора по элементам типаamp;{integer}
3. Если вы конвертируете типы в середине, вам нужно выполнить другую операцию сопоставления.
Ответ №1:
Values
Структура определяется как
Итератор значений HashMap.
Однако есть простой способ преобразовать значения в BinaryHeap
. Поскольку он реализует FromIterator
, вы можете сделать
let heap: BinaryHeap<_> = map.values().collect();
Приведенный выше код создаст BinaryHeap
список ссылок. Если вы хотите, чтобы значения принадлежали куче, вы можете либо переместить значения из карты следующим образом:
let heap: BinaryHeap<_> = map.drain().map(|(_key, value)| value).collect();
или клонируйте значения:
let heap: BinaryHeap<_> = map.values().cloned().collect();
Обратите внимание, что если ваш тип значения Copy
(like i32
), вы можете вызвать .copied()
вместо .cloned()
. Это не ускоряет процесс, но это более точная и эффективная практика.
Комментарии:
1. Я попробовал первую версию, и она работала нормально. Спасибо за помощь
2. Обратите внимание, что вы можете использовать
.copied()
вместо.cloned()
того, чтобы утверждать, что клон «дешевый» (равный побитовой копии данных).3. @user4815162342 Спасибо, я добавил упоминание в конце