Как мога да използвам комплексно число като ключ в карта? Ето малък пример, който няма да се компилира:
#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