На этом шаге мы рассмотрим особенности использования операций сравнения.
Из всех операций сравнения для комплексных чисел определены только проверки на равенство и на неравенство (таблица 1). Операторы == и != определены как глобальные функции, поэтому один из операндов может быть скалярной величиной. В этом случае операнд интерпретируется как вещественная часть, а мнимой части комплексного числа присваивается значение по умолчанию для данного типа (обычно 0).
Другие операции сравнения (например, с оператором < и т. д.) для класса complex не определены. Хотя в принципе для комплексных чисел можно определить порядок сортировки, результат получается недостаточно интуитивным и не приносит особой практической пользы. Например, сравнивать комплексные числа на основании модулей бессмысленно, поскольку два разных комплексных числа (например, 1 и -1) могут иметь одинаковые модули. Конечно, можно изобрести специальный критерий сортировки, например, для двух комплексных чисел c1 и с2 считать, что c1<c2 при выполнении условия |c1|<|c2|, а в случае совпадения модулей - при выполнении условия arg(c1)<arg(c2). Тем не менее такие искусственные критерии не обладают математическим смыслом.
Выражение | Описание |
---|---|
c1 == с2 | Проверка на равенство c1 и с2 (c1.real()==c2.real() && c1.imag()==c2.imag()) |
c == 1.7 | Проверка на равенство c1 и 1.7 (c1.real()==1.7 && c1.imag()==0.0) |
1.7 == c | Проверка на равенство 1.7 и c1 (c1.real()==1.7 && c1.imag()==0.0) |
c1 != с2 | Проверка на неравенство c1 и с2 (c1.real()!=c2.real() || c1.imag()!=c2.imag()) |
c != 1.7 | Проверка на неравенство c1 и 1.7 (c1.real()!=1.7 || c1.imag()!=0.0) |
1.7 != c | Проверка на неравенство 1.7 и c1 (c1.real()!=1.7 || c1.imag()!=0.0) |
Из этого следует, что тип complex не может быть типом элементов ассоциативных контейнеров (без определения пользовательского критерия сортировки). Дело в том, что для сортировки элементов по умолчанию ассоциативные контейнеры используют объект функции less<>, который вызывает оператор <.
Определение пользовательского оператора < позволяет сортировать комплексные числа и использовать их в ассоциативных контейнерах. Будьте внимательны и не нарушайте стандартное пространство имен. Пример:
template <class T> bool operator< (const std::complex<T>& c1, const std::complex<T>& c2) { return std::abs(cl)<std::abs(c2) || (std::abs(c1)==std::abs(c2) && std::arg(c1)<std::arg(c2)); }
На следующем шаге мы рассмотрим арифметические операции.