命名空间
变体
操作

operator==,!=,<,<=,>,>=,<=>(std::forward_list)

来自 cppreference.com
< cpp‎ | 容器‎ | 前向列表
 
 
 
 
在头文件 <forward_list> 中定义
template< class T, class Alloc >

bool operator==( const std::forward_list<T, Alloc>& lhs,

                 const std::forward_list<T, Alloc>& rhs );
(1) (自 C++11 起)
template< class T, class Alloc >

bool operator!=( const std::forward_list<T, Alloc>& lhs,

                 const std::forward_list<T, Alloc>& rhs );
(2) (自 C++11 起)
(直到 C++20)
template< class T, class Alloc >

bool operator<( const std::forward_list<T, Alloc>& lhs,

                const std::forward_list<T, Alloc>& rhs );
(3) (自 C++11 起)
(直到 C++20)
template< class T, class Alloc >

bool operator<=( const std::forward_list<T, Alloc>& lhs,

                 const std::forward_list<T, Alloc>& rhs );
(4) (自 C++11 起)
(直到 C++20)
template< class T, class Alloc >

bool operator>( const std::forward_list<T, Alloc>& lhs,

                const std::forward_list<T, Alloc>& rhs );
(5) (自 C++11 起)
(直到 C++20)
template< class T, class Alloc >

bool operator>=( const std::forward_list<T, Alloc>& lhs,

                 const std::forward_list<T, Alloc>& rhs );
(6) (自 C++11 起)
(直到 C++20)
template< class T, class Alloc >

synth-three-way-result<T>
    operator<=>( const std::forward_list<T, Alloc>& lhs,

                 const std::forward_list<T, Alloc>& rhs );
(7) (自 C++20 起)

比较两个 forward_list 的内容。

1,2) 检查 lhsrhs 的内容是否相等,也就是说,它们具有相同数量的元素,并且 lhs 中的每个元素都与 rhs 中相同位置的元素相等。
3-6) 按字典顺序比较 lhsrhs 的内容。比较由等效于 std::lexicographical_compare 的函数执行。
7) 按字典顺序比较 lhsrhs 的内容。比较就好像通过调用 std::lexicographical_compare_three_way(lhs.begin(), lhs.end(),
                                       rhs.begin(), rhs.end(), synth-three-way)
.
返回类型是 synth-three-way 的返回类型(即 synth-three-way-result <T>)。
如果不满足以下任何条件,则行为未定义
  • T 模仿 three_way_comparable
  • < 为类型(可能限定为 const)T 的值定义,并且 < 是一个完全排序关系。

<<=>>=!= 运算符分别从 operator<=>operator== 中合成。

(自 C++20 起)

内容

[编辑] 参数

lhs, rhs - 要比较内容的 forward_list
-
T 必须满足 EqualityComparable 的要求,才能使用重载 (1,2)。
-
T 必须满足 LessThanComparable 的要求,才能使用重载 (3-6)。排序关系必须建立完全排序。

[编辑] 返回值

1) 如果 forward_list 的内容相等,则为 true,否则为 false
2) 如果 forward_list 的内容不相等,则为 true,否则为 false
3) 如果 lhs 的内容按字典顺序小于rhs 的内容,则为 true,否则为 false
4) true 如果 lhs 的内容在字典序上 小于等于 rhs 的内容,否则为 false
5) true 如果 lhs 的内容在字典序上 大于 rhs 的内容,否则为 false
6) true 如果 lhs 的内容在字典序上 大于等于 rhs 的内容,否则为 false
7) 如果存在这样的元素,则 lhsrhs 中第一对不相等元素的相对顺序;否则为 lhs.size() <=> rhs.size()

[编辑] 复杂度

forward_list 的大小线性相关。

[编辑] 注释

关系运算符是根据元素类型的 operator< 定义的。

(直到 C++20)

关系运算符是根据 synth-three-way 定义的,如果可能,它使用 operator<=>,否则使用 operator<

值得注意的是,如果元素本身没有提供 operator<=>,但可以隐式转换为可进行三方比较的类型,则将使用该转换而不是 operator<

(自 C++20 起)

[编辑] 示例

#include <cassert>
#include <compare>
#include <forward_list>
 
int main()
{
    const std::forward_list
        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
需要