operator==,!=,<,<=,>,>=,<=>(std::vector)
来自 cppreference.cn
定义于头文件 <vector> |
||
template< class T, class Alloc > bool operator==( const std::vector<T, Alloc>& lhs, |
(1) | (constexpr since C++20) |
template< class T, class Alloc > bool operator!=( const std::vector<T, Alloc>& lhs, |
(2) | (C++20 前) |
template< class T, class Alloc > bool operator<( const std::vector<T, Alloc>& lhs, |
(3) | (C++20 前) |
template< class T, class Alloc > bool operator<=( const std::vector<T, Alloc>& lhs, |
(4) | (C++20 前) |
template< class T, class Alloc > bool operator>( const std::vector<T, Alloc>& lhs, |
(5) | (C++20 前) |
template< class T, class Alloc > bool operator>=( const std::vector<T, Alloc>& lhs, |
(6) | (C++20 前) |
template< class T, class Alloc > constexpr synth-three-way-result<T> |
(7) | (C++20 起) |
比较两个 vector
的内容。
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 | - | 要比较内容的 vector |
-为了使用重载 (1,2),T 必须满足 EqualityComparable 的要求。 | ||
-为了使用重载 (3-6),T 必须满足 LessThanComparable 的要求。排序关系必须建立全序。 |
[编辑] 返回值
1) 如果 vector 的内容相等,则为 true,否则为 false。
2) 如果 vector 的内容不相等,则为 true,否则为 false。
3) 如果 lhs 的内容在字典序上小于 rhs 的内容,则为 true,否则为 false。
4) 如果 lhs 的内容在字典序上小于或等于 rhs 的内容,则为 true,否则为 false。
5) 如果 lhs 的内容在字典序上大于 rhs 的内容,则为 true,否则为 false。
6) 如果 lhs 的内容在字典序上大于或等于 rhs 的内容,则为 true,否则为 false。
7) 若存在非等价元素对,则为 lhs 和 rhs 中首个非等价元素对的相对顺序;否则为 lhs.size() <=> rhs.size()。
[编辑] 复杂度
1,2) 若 lhs 和 rhs 大小不同则为常数,否则与
vector
的大小呈线性关系。3-7) 与
vector
的大小呈线性关系。[编辑] 注解
关系运算符根据元素类型的 operator< 定义。 |
(C++20 前) |
关系运算符根据 synth-three-way 定义,它在可能时使用 operator<=>,否则使用 operator<。 值得注意的是,如果元素自身不提供 operator<=>,但可隐式转换为三路比较类型,则将使用该转换而非 operator<。 |
(C++20 起) |
[编辑] 示例
运行此代码
#include <cassert> #include <compare> #include <vector> int main() { const std::vector a{1, 2, 3}, b{1, 2, 3}, c{7, 8, 9, 10}; 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 && ""); }
[编辑] 缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
LWG 3431 | C++20 | operator<=> 不要求 T 建模 three_way_comparable |
要求 |