c++ - 使用 std::complex<double> 作为 std::map 键

标签 c++ c++11 stdmap

如何使用复数作为 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 为真,这对 map 应该没问题),但编译器不'把它捡起来。

我对 unordered_map 有类似的问题(complex<double> 没有散列)

最佳答案

我没有看过实现,但是根据 cppreference std::map 使用 std::less<T>作为比较运算符,它可能不专门用于 std::complex ,如果你实现一个,将它作为模板中的第三个参数传递 std::map<std::complex, int, LessOperator> std:unordered_map 类似,您可以在其中提供哈希仿函数和相等仿函数。如果这两个都实现了,你可以使用 std::complex作为关键。

关于c++ - 使用 std::complex<double> 作为 std::map 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26245189/

相关文章:

c++ - 在 C++ 中返回字符串的最佳方法是什么?

c++ - 如何使用 QTcpSocket 监听 qt 中的特定端口?

c++ - 如何在范围 for 循环中使用 begin() 和 end()

c++ - 使用 braced-init 初始化 std::shared_ptr<std::map<>>

c++ - 如何访问成对元素的映射?

c++ - 架构问题 : access-queue block

C++ 太多大小为 4 的写入/读取

c++11 - 这个代码有效还是无效? GCC 和 Clang 不同意

c++ - 是否加入 std::thread 刷新内存?

c++ - 未使用的 STL 容器是否分配内存?