Was könnte ein unordered_map
möglicherweise mit dem Hinweis tun? Nun, wenn der Iterator ein Element mit dem gleichen Schlüssel wie das Element anspricht, das emplace_hint
wurde eingefügt werden soll, dann kann es schnell scheitern - nur ein Schlüsselvergleich ohne Hashing oder tappen durch eine Liste von Hash-kollidierenden Elementen in diesem Bucket. Aber wenn der Schlüssel nicht übereinstimmt, dann ist der Hinweis ansonsten nutzlos, weil jeder andere Schlüssel (egal wie "nah" im Wert) (probabilistisch) in einem völlig unabhängigen Bucket sein sollte (angesichts dessen, was normalerweise eine "gute" Hash-Funktion ist)), so wäre die Zeit für einen Schlüsselvergleich verschwendet worden, nur um von vorne anfangen zu müssen, als ob es ein normaler emplace
wäre.
Dies kann nützlich sein, wenn Sie Elemente vorsortiert nach Schlüssel einfügen, mit dem Ziel, viele Duplikate im Prozess zu entfernen, aber der Schlüssel ist so groß, dass es einfacher ist, einen Iterator für das gerade eingefügte Element beizubehalten als eine Kopie des Schlüssels, oder vielleicht ist die Hash-Funktion besonders langsam.
Ein weiterer Vorteil der unordered_map::emplace_hint
ist besser API-Kompatibilität mit map::emplace_hint
, so kann Code schalten Sie den Typ Container und haben die emplace_hint
s die Kompilierung nicht brechen, obwohl sie als am Ende vielleicht langsamer, wenn der Code auf emplace()
als nah- geschaltet wurden but-different-key Hinweise, die mit einem map
helfen, können mit einem unordered_map
nutzlos sein.
Ich habe diese Antwort nicht vollständig erhalten. Vielleicht liegt es daran, wie es formuliert ist. Also ist es nutzlos, wenn ich nicht mehrere Schlüssel vorbestellt habe? – Dean
@Dean: Sie müssen nicht unbedingt "mehrere Schlüssel vorbestellen" - es könnte sein, dass die Reihenfolge, in der sie natürlich auftreten, wiederholte Schlüssel eine ausreichend hohe Wahrscheinlichkeit haben, nacheinander aufzutreten, um einen Iterator beizubehalten der zuletzt platzierte Wert lohnt sich, da Sie das Duplikat schnell ablehnen könnten. Dennoch basiert alles auf der einzigen möglichen Verwendung des Hinweises, den ich mir vorstellen kann - wenn Ihre Implementierung den Hinweis nicht wirklich verwendet, verschwenden Sie Zeit und Mühe, ihn zu liefern. –