9.2.7. Операторы сравнения
Для сравнения используется тот же реляционный оператор, который определен для типа элементов: при сравнении двух контейнеров на неравенство (!=) используется оператор != типа их элементов. Если тип элемента не поддерживает определенный оператор, то для сравнения контейнеров такого типа данный оператор использовать нельзя.
Сравнение двух контейнеров осуществляется на основании сравнения пар их элементов. Эти операторы работают так же, как и таковые у класса string (см. раздел 3.2.2):
• Если оба контейнера имеют одинаковый размер и все их элементы совпадают, контейнеры равны, в противном случае — не равны.
• Если контейнеры имеют различный размер, но каждый элемент короткого совпадает с соответствующим элементом длинного, считается, что короткий контейнер меньше длинного.
• Если значения элементов контейнеров не совпадают, результат их сравнения зависит от значений первых неравных элементов.
Проще всего понять работу операторов, рассмотрев их на примерах.
vector<int> v1 = { 1, 3, 5, 7, 9, 12 };
vector<int> v2 = { 1, 3, 9 };
vector<int> v3 = { 1, 3, 5, 7 };
vector<int> v4 = { 1, 3, 5, 7, 9, 12 };
v1 < v2 // true; v1 и v2 отличаются элементом [2]: v1[2] меньше,
// чем v2[2]
v1 < v3 // false; все элементы равны, но у v3 их меньше;
v1 == v4 // true; все элементы равны и размер v1 и v4 одинаков
v1 == v2 // false; v2 имеет меньше элементов, чем v1
При сравнении контейнеров используются операторы сравнения их элементов
Операторы равенства контейнеров используют оператор == элемента, а операторы сравнения — оператор < элемента. Если тип элемента не предоставляет необходимый оператор, то не получится использовать соответствующие операторы и с содержащими их контейнерами. Например, определенный в главе 7 тип Sales_data не предоставлял операторов == и <. Поэтому нельзя сравнить два контейнера, содержащих элементы типа Sales_data:
vector<Sales_data> storeA, storeB;
if (storeA < storeB) // ошибка: Sales_data не имеет оператора <
Упражнения раздела 9.2.7
Упражнение 9.15. Напишите программу, выясняющую, равны ли два вектора vector<int>.
Упражнение 9.16. Перепишите предыдущую программу, но сравните элементы списка list<int> и вектора vector<int>.
Упражнение 9.17. Допустим, c1 и c2 являются контейнерами. Какие условия налагают типы их элементов в следующем выражении?
if (c1 < c2)