对没有比较器或 lambda 函数的向量进行排序?

Posted

技术标签:

【中文标题】对没有比较器或 lambda 函数的向量进行排序?【英文标题】:Sorting vector of vectors without comparator or lambda function? 【发布时间】:2020-01-09 16:26:31 【问题描述】:

今天我遇到了一些我认为无法编译的 C++ 代码:

#include <vector>
#include <algorithm>
using namespace std;

int main() 
    vector<vector<int>> vectorOfVectors =   2, 3, 5 ,  1, 2, 3  ;

    sort(vectorOfVectors.begin(), vectorOfVectors.end());

    return 0;

据我所知,C++ 中没有用于整数向量的默认比较器,因此必须实现自定义比较器或 lambda 函数才能将其传递给 sort() 函数。

然而,这段代码编译的事实让我想问这个问题;整数向量是否有默认比较器?是否有一个用于浮点数、双打等?还是编译器会自动生成?需要注意的是,这种对向量进行排序的方式在网上是找不到的。

提前致谢!

【问题讨论】:

是的,任何东西的向量都有一个默认的比较器,只要“任何东西”本身是可比较的。所以vector&lt;anything&gt; 变得可比。由于这是可比较的,vector&lt;vector&lt;anything&gt;&gt; 也必须是可比较的。 en.cppreference.com/w/cpp/container/vector/operator_cmp “据我所知,C++ 中没有向量的默认比较器”你知道错了。 【参考方案1】:

来自std::sort 上的cppreference,用于void sort( RandomIt first, RandomIt last ); 的重载:

1) 使用operator&lt;比较元素。

std::vector&lt;T&gt; 提供operator&lt;。它的行为是:

按字典顺序比较lhsrhs 的内容。比较由等效于 std::lexicographical_compare 的函数执行。

不带比较器的std::lexicographical_compare 的重载行为是:

1) 使用operator&lt;比较元素。

只要std::vector&lt;T&gt; 中的T 类型与operator&lt; 可比较,那么std::vector&lt;T&gt; 就可以与operator&lt; 进行比较,从而与std::sort 兼容。由于intoperator&lt; 具有可比性,因此std::vector&lt;int&gt; 也是如此,因此std::vector&lt;std::vector&lt;int&gt;&gt; 也是如此。这些类型中的每一种都可以在没有显式比较器的情况下与 std::sort 一起使用。

【讨论】:

【参考方案2】:

据我所知,C++ 中没有向量的默认比较器...

vectors 定义了比较运算符:

https://en.cppreference.com/w/cpp/container/vector/operator_cmp

std::vector 定义了运算符== != &lt; &lt;= &gt; &gt;=

因为它是一个模板类,你不需要为vector 可以容纳的每个可能的类型定义operator&lt;。如果类型满足LessThanComparable的要求,就会生成。

由于int 显然可以与&lt; 进行比较,所以vector&lt;int&gt; 将为其生成operator&lt;

【讨论】:

以上是关于对没有比较器或 lambda 函数的向量进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::sort 对包含两个数据成员的对象向量进行排序

使用lambda函数进行向量排序,当不在同一范围内时如何传递变量来捕获组?

用 sort() 对成员向量进行排序的比较函数

用于对字符串向量进行排序的比较函数(每个字符串都是一个数字)C++

访问算法的 lambda 函数中的迭代器导致我出现分段错误

用于对包含指向自定义类对象的指针的向量进行排序的比较器