std::map требует strict weak ordering. float нарушает его при наличии NaN. std::strong_order спасает.#include <compare>
#include <map>
#include <iostream>
struct FloatCompare {
bool operator()(double a, double b) const {
// strong_order — total order, строго соответствует требованиям map
return std::strong_order(a, b) == std::strong_ordering::less;
}
};
int main() {
std::map<double, std::string, FloatCompare> m;
m[1.0] = "one";
m[-0.0] = "negative zero";
m[+0.0] = "positive zero"; // отдельный ключ! (strong_order различает)
m[std::numeric_limits<double>::quiet_NaN()] = "nan";
m[std::numeric_limits<double>::infinity()] = "inf";
// Все 5 ключей уникальны и упорядочены детерминированно
std::cout << m.size(); // 5
}
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность