Как я могу вставить все значения одного HashSet в другой HashSet? - PullRequest
1 голос
/ 15 мая 2019

У меня есть два HashSet<u16> с, и я хотел бы реализовать a = a U b.Если возможно, я бы хотел использовать HashSet::union вместо циклов или других настроек.

Я попробовал следующее:

use std::collections::HashSet;
let mut a: HashSet<u16> = [1, 2, 3].iter().cloned().collect();
let b: HashSet<u16> = [7, 8, 9].iter().cloned().collect();  

// I can build a union object that contains &u16
let union: HashSet<&u16> = a.union(&b).collect();

// But I can't store the union into a
a = a.union(&b).collect();   //  -> compile error

// of course I can do
for x in &b {
    a.insert(*x);
}
// but I wonder if union could not be used to simply build a union

Сообщение об ошибке следующее:

the trait bound 
`std::collections::HashSet<u16>: std::iter::FromIterator<&u16>`
is not satisfied

Как мне выполнить a = a U a?

1 Ответ

3 голосов
/ 15 мая 2019

Вы не хотите union - как вы сказали, он создаст новый HashSet. Вместо этого вы можете использовать Extend::extend:

use std::collections::HashSet;

fn main() {
    let mut a: HashSet<u16> = [1, 2, 3].iter().cloned().collect();
    let b: HashSet<u16> = [1, 3, 7, 8, 9].iter().cloned().collect();

    a.extend(&b);

    println!("{:?}", a);
}

( 1010 * площадка *)

Extend::extend также реализован для других коллекций , например Vec. Результат для Vec будет отличаться, потому что Vec не учитывает дубликаты так же, как Set.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...