Шаг 416.
Библиотека STL.
Числовые типы. Операции над комплексными числами. Операции сравнения

    На этом шаге мы рассмотрим особенности использования операций сравнения.

    Из всех операций сравнения для комплексных чисел определены только проверки на равенство и на неравенство (таблица 1). Операторы == и != определены как глобальные функции, поэтому один из операндов может быть скалярной величиной. В этом случае операнд интерпретируется как вещественная часть, а мнимой части комплексного числа присваивается значение по умолчанию для данного типа (обычно 0).

    Другие операции сравнения (например, с оператором < и т. д.) для класса complex не определены. Хотя в принципе для комплексных чисел можно определить порядок сортировки, результат получается недостаточно интуитивным и не приносит особой практической пользы. Например, сравнивать комплексные числа на основании модулей бессмысленно, поскольку два разных комплексных числа (например, 1 и -1) могут иметь одинаковые модули. Конечно, можно изобрести специальный критерий сортировки, например, для двух комплексных чисел c1 и с2 считать, что c1<c2 при выполнении условия |c1|<|c2|, а в случае совпадения модулей - при выполнении условия arg(c1)<arg(c2). Тем не менее такие искусственные критерии не обладают математическим смыслом.

Таблица 1. Операции сравнения для класса complex<>
Выражение Описание
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)); 
}

    На следующем шаге мы рассмотрим арифметические операции.




Предыдущий шаг Содержание Следующий шаг