Преобразование значений хэш-карты в двоичную кучу

#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 Спасибо, я добавил упоминание в конце