Как я могу использовать комплексное число в качестве ключа на карте? Вот небольшой пример, который не компилируется:
#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
(и все они равны множеству других комплексных чисел)? Вы сможете вставить только один из них на карту. То же самое, конечно, относится и к любому другому набору равенства. - person NPE   schedule 08.10.2014(lhs.real() < rhs.real()) || (lhs.real() == rhs.real() && lhs.imag() < rhs.imag())
. - person Timothy Shields   schedule 08.10.2014==
и!=
) для типаstd::complex
. - person Timothy Shields   schedule 08.10.2014std::map
не использует ни один из этих операторов. Может быть, мой libstdc++ был с особым соусом, но, похоже, он заказывает их черезoperator <
, как я и ожидал. - person WhozCraig   schedule 08.10.2014<
дляstd::complex
. libstdc++ может поставляться с ним, но он может быть определен по-другому или просто недоступен у других поставщиков. - person Timothy Shields   schedule 08.10.2014std=c++11
и kerboom, безoperator <
. Большое спасибо за указание на это. Не ожидал этого. Мучо спасибо! - person WhozCraig   schedule 08.10.2014double
в качестве ключа, так как различия в округлении могут помешать вам получить элемент позже. - person Mark Ransom   schedule 08.10.2014