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

Pup*_*ker 1 c++ sorting lambda vector comparator

今天我遇到了一些我认为不会编译的 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢!

Fra*_*eux 10

从 cppreference 开始std::sort,对于重载void sort( RandomIt first, RandomIt last );

1) 使用 比较元素operator<

std::vector<T>提供operator<. 它的行为是:

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

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

1) 使用 比较元素operator<

所以只要Tin的类型std::vector<T>operator<then相比较,就std::vector<T>可以与 相比较,operator<从而兼容std::sort。既然int是可比的operator<,所以是std::vector<int>,所以是std::vector<std::vector<int>>。这些类型中的每一种都可以在std::sort没有显式比较器的情况下使用。


Rin*_*dov 7

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

vectors定义了比较运算符:

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

std::vector已定义运算符== != < <= > >=

由于它是一个模板类,因此您不需要为operator<avector可以容纳的每个可能的类型进行定义。如果类型满足LessThanComparable要求,则会生成它。

正如int显然可以相比<vector<int>将有operator<它产生的。