2016-06-15 9 views
5

Mam HashMap<(String, usize), f64>. Mam również &str i usize, które chciałbym sprawdzić w tym HashMap bez klonowania. Czy istnieje sposób, aby w jakiś sposób odszukać (&str, usize) jako?Wyszukaj klucz w HashMap <(String, usize), f64> w Rust

+1

Jeśli to możliwe, musisz użyć 'Krowy', zobacz http://stackoverflow.com/questions/36480845/how-to-avoid-temporary-allocations-when-using-complex-key- for-hashmap – tafia

+0

Dowolny powód nie chcesz używać 'HashMap <(& str, usize), f64>'? Być może nie rozumiem rdzy wystarczająco dobrze, ale wydaje mi się to rozsądnym rozwiązaniem. – user25064

+1

@ user25064 coś musi posiadać alokację 'String', a być może klucz mapy jest najbardziej naturalny. Podział tych dwóch na części jest potencjalnym rozwiązaniem, w zależności od użycia. – Shepmaster

Odpowiedz

5

Nie, nie możesz. Opcje dla patrząc w HashMap<K,V> są:

  • Sposób entry, który wymaga K przez wartość, która w danym przypadku jest (String, usize) - tak trzeba by skonstruować String.
  • Różne get, contains_key itp wszystko zrobić „pożyczył” formę K (dokumentacja mówi &Q, gdzie K: Borrow<Q>;. To oznacza albo &(String, usize) lub coś, co może produkowanego jedną

Technicznie można iteracyjne przez to i robić własne porównania, ale to prawdopodobnie nie jest to, co chcesz!

4

Istnieje jednak metoda, która nie wymaga przydzielania ciągu znaków, ale musisz zmienić swoją mapę, aby klucz jest typu (std::borrow::Cow<'a, str>, usize) (dla pewnego życia 'a). Następnie możesz sprawdzić wartości za pomocą map.get((Cow::Borrowed(my_str_slice), 0)).

Powiązane problemy