【发布时间】:2014-10-07 20:58:32
【问题描述】:
如何在地图中使用复数作为键?这是一个无法编译的小例子:
#include <complex>
#include <map>
int main() {
std::complex<double> zero = 0.0;
std::map<std::complex<double>, int> theMap;
return (theMap.count(zero));
}
我可以毫无错误地创建地图,但是任何方法(例如,上面的 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> 没有哈希)
【问题讨论】:
-
您不介意在您的比较方案中
1 == -1 == i == -i(它们都等于许多其他复数)吗?您只能将其中一个插入地图。当然,其他所有等式集也是如此。 -
欢迎来到 StackOverflow。具体来说,您遇到了哪些错误?
-
考虑改用
(lhs.real() < rhs.real()) || (lhs.real() == rhs.real() && lhs.imag() < rhs.imag())。 -
@WhozCraig 复数没有自然排序。同样,
std::complex类型没有内置的比较运算符(除了==和!=)。 -
@TimothyShields 我切换到严格的
std=c++11和kerboom,没有operator <。非常感谢您非常指出这一点。没有看到那到来。非常感谢!