Pytania otagowane jako unordered-map

12
Czy jest jakaś zaleta korzystania z mapy nad unordered_map w przypadku trywialnych kluczy?
Niedawna rozmowa unordered_mapw C ++ uświadomiła mi, że powinienem używać tego unordered_mapw większości przypadków, w których mapwcześniej go użyłem , ze względu na efektywność wyszukiwania ( zamortyzowane O (1) vs. O (log n) ). Najwięcej razy używam mapę, używam albo intczy std::stringjako kluczowy typu; stąd nie mam problemów z definicją …


3
Jak wyspecjalizować operator () std :: hash <Key> :: dla typu zdefiniowanego przez użytkownika w nieuporządkowanych kontenerach?
Aby obsługiwać typy kluczy zdefiniowane przez użytkownika w programie std::unordered_set&lt;Key&gt;i std::unordered_map&lt;Key, Value&gt; należy podać operator==(Key, Key)funktor skrótu: struct X { int id; /* ... */ }; bool operator==(X a, X b) { return a.id == b.id; } struct MyHash { size_t operator()(const X&amp; x) const { return std::hash&lt;int&gt;()(x.id); } }; …

5
Jak wybrać między mapą a unordered_map?
Załóżmy, że chciałbym zmapować dane z ciągiem znaków jako kluczem. Jaki pojemnik powinienem wybrać, mapczy unordered_map? unordered_mapzajmuje więcej pamięci, więc załóżmy, że pamięć nie jest problemem, a problemem jest szybkość. unordered_mappowinien generalnie dawać średnią złożoność O (1) z najgorszym przypadkiem O (n). W jakich przypadkach doszłoby do O (n)? Kiedy …

2
Czy operator std :: unordered_map [] wykonuje inicjalizację zera dla nieistniejącego klucza?
Według cppreference.com, std::map::operator[]dla nieistniejącej wartości robi zerową inicjalizację. Jednak ta sama strona nie wspomina o zerowej inicjalizacji std::unordered_map::operator[], z wyjątkiem tego, że opiera się na tym przykładzie. Oczywiście jest to tylko strona referencyjna, a nie standard. Czy poniższy kod jest w porządku, czy nie? #include &lt;unordered_map&gt; int main() { std::unordered_map&lt;int, …

1
Wyciek pamięci podczas unordered_map :: wstaw wyjątek KeyEqual z GCC - przełamanie silnej gwarancji bezpieczeństwa wyjątku?
Korzystam z GCC 7.3.1, ale testowałem również na coliru, które moim zdaniem to wersja 9.2.0. Kompiluj za pomocą: g++ -fsanitize=address -fno-omit-frame-pointer rai.cpp Oto rai.cpp: #include &lt;iostream&gt; #include &lt;unordered_map&gt; int main() { try { struct MyComp { bool operator()(const std::string&amp;, const std::string&amp;) const { throw std::runtime_error("Nonono"); } }; std::unordered_map&lt;std::string, std::string, std::hash&lt;std::string&gt;, …
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.