operator==,!=,<,<=,>,>=,<=>(std::array)
来自 cppreference.com
定义在头文件 <array> 中 |
||
template< class T, std::size_t N > bool operator==( const std::array<T, N>& lhs, |
(1) | (自 C++11) (自 C++20 起为 constexpr) |
template< class T, std::size_t N > bool operator!=( const std::array<T, N>& lhs, |
(2) | (自 C++11) (直到 C++20) |
template< class T, std::size_t N > bool operator<( const std::array<T, N>& lhs, |
(3) | (自 C++11) (直到 C++20) |
template< class T, std::size_t N > bool operator<=( const std::array<T, N>& lhs, |
(4) | (自 C++11) (直到 C++20) |
template< class T, std::size_t N > bool operator>( const std::array<T, N>& lhs, |
(5) | (自 C++11) (直到 C++20) |
template< class T, std::size_t N > bool operator>=( const std::array<T, N>& lhs, |
(6) | (自 C++11) (直到 C++20) |
template< class T, std::size_t N > constexpr synth-three-way-result<T> |
(7) | (自 C++20) |
比较两个 array
的内容。
1,2) 检查 lhs 和 rhs 的内容是否相等,也就是说,它们具有相同数量的元素,并且 lhs 中的每个元素都与 rhs 中相同位置的元素相等。
7) 按字典序比较 lhs 和 rhs 的内容。比较执行方式如同调用 std::lexicographical_compare_three_way(lhs.begin(), lhs.end(),
rhs.begin(), rhs.end(),
synth-three-way). 如果不满足以下任一条件,则行为未定义
-
T
符合three_way_comparable
的要求。 -
<
已为类型(可能为 const 限定)T
的值定义,并且<
是一个完全排序关系。
|
(自 C++20) |
内容 |
[编辑] 参数
lhs, rhs | - | 要比较内容的 array |
-为了使用重载 (1,2),T 必须满足 EqualityComparable 的要求。 | ||
-为了使用重载 (3-6),T 必须满足 LessThanComparable 的要求。排序关系必须建立完全顺序。 |
[编辑] 返回值
1) 如果
array
的内容相等,则为 true,否则为 false。2) 如果
array
的内容不相等,则为 true,否则为 false。3) 如果 lhs 的内容按字典序小于 rhs 的内容,则为 true,否则为 false。
4) 如果 lhs 的内容按字典序小于或等于 rhs 的内容,则为 true,否则为 false。
5) true 如果 lhs 的内容在字典序上大于rhs 的内容,否则为 false。
6) true 如果 lhs 的内容在字典序上大于或等于rhs 的内容,否则为 false。
7) 如果存在这样的元素,则为 lhs 和 rhs 中第一对不相等元素的相对顺序,否则为 lhs.size() <=> rhs.size()。
[edit] 复杂度
与 array
的大小呈线性关系。
[edit] 备注
关系运算符根据元素类型的 operator< 定义。 |
(直到 C++20) |
关系运算符根据 synth-three-way 定义,如果可能,它使用 operator<=>,否则使用 operator<。 值得注意的是,如果元素本身不提供 operator<=>,但可以隐式转换为可三向比较的类型,则将使用该转换,而不是 operator<。 |
(自 C++20) |
[edit] 示例
运行此代码
#include <cassert> #include <compare> #include <array> int main() { const std::array a{1, 2, 3}, b{1, 2, 3}, c{7, 8, 9}; assert ("" "Compare equal containers:" && (a != b) == false && (a == b) == true && (a < b) == false && (a <= b) == true && (a > b) == false && (a >= b) == true && (a <=> b) != std::weak_ordering::less && (a <=> b) != std::weak_ordering::greater && (a <=> b) == std::weak_ordering::equivalent && (a <=> b) >= 0 && (a <=> b) <= 0 && (a <=> b) == 0 && "Compare non equal containers:" && (a != c) == true && (a == c) == false && (a < c) == true && (a <= c) == true && (a > c) == false && (a >= c) == false && (a <=> c) == std::weak_ordering::less && (a <=> c) != std::weak_ordering::equivalent && (a <=> c) != std::weak_ordering::greater && (a <=> c) < 0 && (a <=> c) != 0 && (a <=> c) <= 0 && ""); }
[edit] 缺陷报告
以下行为更改缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 3431 | C++20 | operator<=> 不要求 T 建模 three_way_comparable |
要求 |