2011-08-27 9 views
20

W boost::unordered_map Jak ustalić, czy klucz istnieje w nim, czy nie?C++ boost unordered_map - ustal, czy klucz istnieje w kontenerze

boost::unordered_map<vector<int>, MyValueType> my_hash_map; 

if (my_hash_map[non-existent key] == NULL) 

Powyższy dostaje błąd kompilatora „nie pasuje do operatora«==»...”

Czy problem Używam typ wartości niestandardowej lub coś innego?

Odpowiedz

30

Można użyć metody find:

if (my_hash_map.find(non-existent key) == my_hash_map.end()) 
+4

... jak z wszelkich standardowych kontenerów zgodnych, nawiasem mówiąc. – xtofl

+0

Szybka obserwacja, czy to nadal dzieje się w O (1)? Dzięki! – gewizz

+2

Zakładam, że tak, ponieważ unordered_map jest tabelą mieszającą. –

25

exist() jest pisane count() dla każdego associative container:

if (my_hash_map.count(key)) { /*key exist*/ } 

if (!my_hash_map.count(key)) { /*key does not exist*/ } 
+5

Zazwyczaj nie ma to znaczenia, ale mogę sobie wyobrazić, że 'count()' jest droższe, szczególnie jeśli masz wiele wartości na klucz, ponieważ musi on faktycznie wykonywać iteracje nad wszystkimi. –

+0

@ Lukáš Lalinský: Tak, dla 'multi_ *' container 'count() 'może mieć gorszą wydajność niż' find() '. – dalle

+0

W zależności od rozmiaru 'my_hash_map', nadal można preferować metodę' .count() '(zamiast' .find() '), ponieważ poprawnie obsługuje ona przypadek graniczny, w którym' my_hash_map' zawiera pojedynczy klucz/wartość (s) para. – Kris

Powiązane problemy