如何在 C++ 中比较 std::array ?

Posted

技术标签:

【中文标题】如何在 C++ 中比较 std::array ?【英文标题】:How are std::array's compared in C++? 【发布时间】:2020-02-11 18:47:39 【问题描述】:

对于下面的代码,为什么输出为 1?

#include<iostream>
#include<array>

int main() 
    std::array<int, 5> a  10, 11, 12, 15, 14 ;
    std::array<int, 5> b  11, 12, 13, 14, 15 ;
    std::cout << (a < b);

【问题讨论】:

阅读一些文档以了解en.cppreference.com/w/cpp/container/array/operator_cmpen.cppreference.com/w/cpp/algorithm/lexicographical_compare 试试cout &lt;&lt; std::boolalpha &lt;&lt; (a &lt; b); why is the output coming as 1? 你期待什么输出? 1 对我来说似乎是正确的。 @Borgleader:OP 没有这种直觉,因此他/她的问题。也许OP期待一个错误?还是 0 表示无法比较? 我认为这就是@einpoklum 的重点。他们没有告诉我们他们所期望的 【参考方案1】:

他们使用标准算法std::lexicographical_compare

来自C++标准中算法的描述

3 备注:如果两个序列有相同数量的元素和它们的 对应的元素(如果有的话)是等价的,那么这两个序列都不是 在字典上小于另一个。如果一个序列是前缀 另一个,那么较短的序列在字典上小于 较长的序列。否则, 序列产生与第一个比较相同的结果 不等价的对应元素对。

您的示例的输出是布尔值true,即“...与不等价的第一对对应元素的比较结果相同。”

对于您的示例,比较结果(a &lt; b) 是比较结果( a[0] &lt; b[0] )

下面有一个演示程序例如你可以为类模板std::vector写这样一个操作符。

#include <iostream>
#include <iomanip>
#include <array>
#include <vector>
#include <iterator>
#include <algorithm>

template <typename T>
bool operator <( const std::vector<T> &a, const std::vector<T> &b )

    return std::lexicographical_compare( std::begin( a ), std::end( a ),
                                         std::begin( b ), std::end( b ) );


int main() 

    std::array<int, 5> a  10, 11, 12, 15, 14 ;
    std::array<int, 5> b  11, 12, 13, 14, 15 ;

    std::cout << std::boolalpha 
              << std::lexicographical_compare( a.begin(), a.end(),
                                               b.begin(), b.end() )
              << '\n';

    std::vector<int> a1  10, 11, 12, 15, 14 ;
    std::vector<int> b1  11, 12, 13, 14, 15 ;

    std::cout << std::boolalpha << ( a1 < b1 ) << '\n';

    return 0;

【讨论】:

以上是关于如何在 C++ 中比较 std::array ?的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL应用与实现5: 如何使用std::array (since C++11)

std::array 中使用的 C++ 11 中的全局常量

std::array<T, ?> 类型的成员变量

在现代 C++ 中将 std::array<std::array<T,N>> 转换为 std::vector<T>

C++ std::array 到 shared_ptr 的向量

如何在 C++ 中使用数组?