Ich habe hier bei Stackoverflow viel über unordered_map(C++ 11)zeit Komplexität zu lesen, aber ich habe nicht die Antwort für meine Frage gefunden.C++ std :: unordered_map Komplexität
Nehmen wir an, die Indizierung durch integer (nur zum Beispiel):
Insert/an Funktionen arbeiten ständig (im Durchschnitt Zeit), so dass dieses Beispiel würde O nehmen (1)
std::unordered_map<int, int> mymap = {
{ 1, 1},
{ 100, 2},
{ 100000, 3 }
};
Was ich Interessant ist, wie lange es dauert, alle in der Karte gespeicherten (unsortierten) Werte zu durchlaufen - z
for (auto it = mymap.begin(); it != mymap.end(); ++it) { ... }
Kann ich davon ausgehen, dass jeder gespeicherte Wert nur einmal zugegriffen wird (oder zweimal oder Konstant mal) Dies würde bedeuten, dass die Iteration durch alle Werte in der N-wertigen Karte O (N) erfolgt. Die andere Möglichkeit ist, dass mein Beispiel mit den Schlüsseln {1,10,100000} bis zu 1000000 Iteration dauern könnte (wenn durch Array dargestellt)
Gibt es einen anderen Container, der linear durchlaufen werden kann und Wert, der durch gegebenen Schlüssel ständig zugegriffen wird ?
Was würde ich wirklich brauchen, ist (Pseudo-Code)
myStructure.add(key, value) // O(1)
value = myStructure.at(key) // O(1)
for (auto key : mySructure) {...} // O(1) for each key/value pair = O(N) for N values
Ist std :: unordered_map der Struktur die ich brauche?
Integer Indexierung ist ausreichend, durchschnittliche Komplexität auch.
Wenn Sie Bedenken haben, dass die Aufzählung über Paare gehen muss, die Sie * nicht * in Ihren Container eingefügt haben, können Sie sicher sein, dass dies nicht der Fall ist. Die Entscheidung, eine reguläre 'map' vs' unordered_map' zu verwenden, sollte darauf basieren, ob Sie eine relativ strenge, schwache Reihenfolge Ihrer Schlüssel * beibehalten * benötigen. Wenn Sie dies tun, benötigen Sie eine reguläre Karte. Wenn Sie dies nicht tun, ist 'unordered_map' die logischste Wahl (vorausgesetzt, die Schlüssel können zu einer vernünftigen Verteilung gehashed werden). – WhozCraig
@WhozCraig: Ein weiterer zu berücksichtigender funktionaler Faktor bei der Wahl von 'map' oder' unordered_map' ist, ob die Aufhebung vorhandener Iteratoren/Referenzen/Zeiger durch 'insert'/'emplace' /' [] 'das erneute Auflösen akzeptabel ist, dann dort Leistungsunterschiede, die tendenziell in "unordered_map" liegen, sollten aber von denen gemessen werden, deren Profiler/Instrumentierung sagt, dass sie sich wirklich kümmern müssen. –