如何在 map 中使用复数作为键?这是一个不会编译的小示例:
#include <complex>
#include <map>
int main() {
std::complex<double> zero = 0.0;
std::map<std::complex<double>, int> theMap;
return (theMap.count(zero));
}
我可以创建没有错误的 map ,但是任何方法(例如,上面的
count
调用以及find
,[]
运算符,insert
等)都会生成编译时错误。就我的理解而言,这绝对是一个问题,因为使用clang和g++可以获得类似的结果。看起来编译器无法比较两个复数。我创建了所有比较运算符(例如
bool operator< (const std::complex & lhs, const std::complex & rhs) {return (std::norm(lhs) < std::norm(rhs));}
),该运算符用于比较复数(只要您不介意3 < -5
为true,这对于map
应该很好),但是编译器不会选择它。我对unordered_map也有类似的问题(
complex<double>
没有哈希值) 最佳答案
我没有看过实现,但每个cppreference std::map
使用std::less<T>
作为比较运算符,如果您将它作为模板std::complex
中的第三个参数与 std::map<std::complex, int, LessOperator>
类似地实现,则它可能不是std:unordered_map
专用的,您可以在其中提供哈希值仿函数和平等仿函数。如果两者都实现,则可以使用std::complex
作为 key 。