operator==,!=,<,<=,>,>=,<=>(std::pair)
| Определён в заголовке <utility>
|
||
template< class T1, class T2, class U1, class U2 >
bool operator==( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs );
|
(1) | (до 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) | |
template< class T1, class T2, class U1, class U2 >
bool operator!=( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs );
|
(2) | (до 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 >
bool operator<( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs );
|
(3) | (до 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 >
bool operator<=( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs );
|
(4) | (до 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 >
bool operator>( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs );
|
(5) | (до 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 >
bool operator>=( const std::pair<T1, T2>& lhs, const std::pair<U1, U2>& rhs );
|
(6) | (до 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) |
lhs и rhs, то есть сравнивает lhs.first с rhs.first и lhs.second с rhs.second.|
Поведение не определено, если тип и категория значения любого из |
(до C++26) |
|
Эта перегрузка участвует в разрешении перегрузки только в том случае, если оба |
(начиная с C++26) |
lhs и rhs лексикографически с помощью operator<, то есть сравнивает первые элементы и, только если они эквивалентны, сравнивает вторые элементы. Поведение не определено, если тип и категория значения любого из lhs.first < rhs.first, rhs.first < lhs.first или lhs.second < rhs.second не удовлетворяют требованиям BooleanTestable.lhs и rhs лексикографически с помощью synth-three-way, то есть сравнивает первые элементы и, только если они эквивалентны, сравнивает вторые элементы. synth-three-way-result — это тип возвращаемого значения synth-three-way.|
Операторы |
(начиная с C++20) |
Параметры
| lhs, rhs | - | пары для сравнения |
Возвращаемое значение
Примечания
|
Операторы сравнения определяются через operator < каждого элемента. |
(до C++20) |
|
Операторы сравнения определяются через synth-three-way , который использует operator <=> если возможно, или operator < в противном случае. Важно отметить, что если тип элемента сам не предоставляет operator <=> , но неявно преобразуется в тип с трёхсторонним сравнением, это преобразование будет использоваться вместо operator < . |
(начиная с C++20) |
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_constrained_equality
|
202403L
|
(C++26) | Ограниченный operator == для std::pair |
Пример
Поскольку 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++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 296 | C++98 |
описания операторов кроме
==
и
<
отсутствовали
|
добавлены |
|
LWG 2114
( P2167R3 ) |
C++98 | предусловия типов для булевых операций отсутствовали | добавлены |
| LWG 3865 | C++98 |
операторы сравнения принимали только
pair
одинакового типа
|
принимают
pair
разных типов
|
См. также
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20) |
лексикографически сравнивает значения в кортеже (шаблон функции) |