operator==,!=,<,<=,>,>=,<=>(std::pair)
Материал из cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
| Определено в заголовочном файле <utility>
|
||
| (1) | ||
template< class T1, class T2, class U1, class U2 > bool operator==( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs ); |
(до C++14) | |
template< class T1, class T2, class U1, class U2 > constexpr bool operator==( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs ); |
(начиная с C++14) | |
| (2) | ||
template< class T1, class T2, class U1, class U2 > bool operator!=( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs ); |
(до C++14) | |
template< class T1, class T2, class U1, class U2 > constexpr bool operator!=( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs ); |
(начиная с C++14) (до C++20) |
|
| (3) | ||
template< class T1, class T2, class U1, class U2 > bool operator<( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs ); |
(до C++14) | |
template< class T1, class T2, class U1, class U2 > constexpr bool operator<( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs ); |
(начиная с C++14) (до C++20) |
|
| (4) | ||
template< class T1, class T2, class U1, class U2 > bool operator<=( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs ); |
(до C++14) | |
template< class T1, class T2, class U1, class U2 > constexpr bool operator<=( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs ); |
(начиная с C++14) (до C++20) |
|
| (5) | ||
template< class T1, class T2, class U1, class U2 > bool operator>( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs ); |
(до C++14) | |
template< class T1, class T2, class U1, class U2 > constexpr bool operator>( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs ); |
(начиная с C++14) (до C++20) |
|
| (6) | ||
template< class T1, class T2, class U1, class U2 > bool operator>=( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs ); |
(до C++14) | |
template< class T1, class T2, class U1, class U2 > constexpr bool operator>=( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs ); |
(начиная с C++14) (до C++20) |
|
template< class T1, class T2, class U1, class U2 > constexpr std::common_comparison_category_t<synth-three-way-result<T1, U1>, synth-three-way-result<T2, U2>> operator<=>( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs ); |
(7) | (начиная с C++20) |
1,2) Проверяет, равны ли оба элемента
lhs и rhs, то есть сравнивает lhs.first с rhs.first и lhs.second с rhs.second.3-6) Сравнивает
lhs и rhs лексикографически с помощью operator<, то есть сравнивает первые элементы и, только если они эквивалентны, сравнивает вторые элементы.7) Сравнивает
lhs и rhs лексикографически с помощью synth-three-way, то есть сравнивает первые элементы и, только если они эквивалентны, сравнивает вторые элементы. synth-three-way-result тип возвращаемого значения synth-three-way.|
Операторы |
(начиная с C++20) |
Параметры
| lhs, rhs | — | пары для сравнения |
Возвращаемое значение
1)
true, если и lhs.first == rhs.first, и lhs.second == rhs.second, иначе false2)
!(lhs == rhs)3) Если
lhs.first < rhs.first, возвращает true. Иначе, если rhs.first < lhs.first, возвращает false. Иначе, если lhs.second < rhs.second, возвращает true. Иначе возвращает false.4)
!(rhs < lhs)5)
rhs < lhs6)
!(lhs < rhs)7) synth-three-way
(lhs.first, rhs.first), если он не равен 0, иначе synth-three-way(lhs.second, rhs.second).Пример
Поскольку operator< определён для пар, контейнеры пар можно сортировать.
Запустить этот код
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>
#include <vector>
int main()
{
std::vector<std::pair<int, std::string>> v = {{2, "baz"},
{2, "bar"},
{1, "foo"}};
std::sort(v.begin(), v.end());
for (auto p: v)
std::cout << '{' << p.first << ", " << std::quoted(p.second) << "}\n";
}
Вывод:
{1, "foo"}
{2, "bar"}
{2, "baz"}
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 296 | C++98 | описания операторов, отличных от == и <, отсутствовали
|
добавлены |
| LWG 3865 | C++98 | операторы сравнения принимали только pair одного и того же типа
|
принимают pair разных типов
|
Смотрите также
(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(C++20) |
лексикографически сравнивает значения в кортеже (шаблон функции) |