如何在 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 。

09-06 22:43
查看更多