Heim  >  Artikel  >  Backend-Entwicklung  >  Wie können Sie Gleitkommawerte sicher als Schlüssel in „std::map' verwenden und unerwartetes Verhalten vermeiden?

Wie können Sie Gleitkommawerte sicher als Schlüssel in „std::map' verwenden und unerwartetes Verhalten vermeiden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-12 14:57:02292Durchsuche

How can you safely use floating point values as keys in `std::map` and avoid unexpected behavior?

Gleitkomma-Schlüssel in std::map: Vergleiche mit Epsilon vermeiden

Bei der Verwendung von Doppeltypen als Schlüssel in einer std::map können Probleme mit der Gleitkomma-Präzision auftreten . Der Vergleich von Werten mithilfe eines Epsilon-Schwellenwerts kann zwar häufig verwendet werden, kann jedoch gegen die Anforderungen an die Containerreihenfolge verstoßen und zu undefiniertem Verhalten führen.

Um dieses Problem zu beheben, besteht ein sichererer Ansatz darin, einen benutzerdefinierten Vergleichsoperator zu definieren, der NaN-Werte verarbeitet und direkte Schlüssel vermeidet Vergleiche. Darüber hinaus können durch die Verwendung von std::multimap oder std::multiset mehrere Schlüsselwerte berücksichtigt werden, wodurch das Risiko unerwarteten Verhaltens verringert wird.

Um ungefähre Suchen mit Doppelschlüsseln durchzuführen, kann eine Hilfsfunktion verwendet werden, um einen Bereich von zurückzugeben Elemente nahe am Zielwert, gesteuert durch einen Epsilon-Parameter. Dieser Bereich kann dann iteriert werden, um den gewünschten Schlüssel zu finden, falls er vorhanden ist. Alternativ kann eine Schlüsselexistenzprüfungsfunktion basierend auf der Bereichssuche implementiert werden.

Es ist generell ratsam, die Verwendung von Gleitkommawerten als Schlüssel in std::set oder std::map zu vermeiden, da sie möglicherweise eingeführt werden Fehler. Wenn Sie sie von der präziseren Schnittstelle ausschließen, kann das Risiko von Fehlern durch unerwartete Wertevergleiche verringert werden. Ihre Verwendung für automatisch sortierte Sammlungen, bei denen die genaue Reihenfolge nicht entscheidend ist, kann jedoch dennoch von Vorteil sein.

Das obige ist der detaillierte Inhalt vonWie können Sie Gleitkommawerte sicher als Schlüssel in „std::map' verwenden und unerwartetes Verhalten vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn