对没有比较器或 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<anything>
变得可比。由于这是可比较的,vector<vector<anything>>
也必须是可比较的。
en.cppreference.com/w/cpp/container/vector/operator_cmp
“据我所知,C++ 中没有向量的默认比较器”你知道错了。
【参考方案1】:
来自std::sort
上的cppreference,用于void sort( RandomIt first, RandomIt last );
的重载:
1) 使用
operator<
比较元素。
std::vector<T>
提供operator<
。它的行为是:
按字典顺序比较
lhs
和rhs
的内容。比较由等效于 std::lexicographical_compare 的函数执行。
不带比较器的std::lexicographical_compare
的重载行为是:
1) 使用
operator<
比较元素。
只要std::vector<T>
中的T
类型与operator<
可比较,那么std::vector<T>
就可以与operator<
进行比较,从而与std::sort
兼容。由于int
与operator<
具有可比性,因此std::vector<int>
也是如此,因此std::vector<std::vector<int>>
也是如此。这些类型中的每一种都可以在没有显式比较器的情况下与 std::sort
一起使用。
【讨论】:
【参考方案2】:据我所知,C++ 中没有向量的默认比较器...
为vector
s 定义了比较运算符:
https://en.cppreference.com/w/cpp/container/vector/operator_cmp
std::vector
定义了运算符== != < <= > >=
。
因为它是一个模板类,你不需要为vector
可以容纳的每个可能的类型定义operator<
。如果类型满足LessThanComparable的要求,就会生成。
由于int
显然可以与<
进行比较,所以vector<int>
将为其生成operator<
。
【讨论】:
以上是关于对没有比较器或 lambda 函数的向量进行排序?的主要内容,如果未能解决你的问题,请参考以下文章
使用 std::sort 对包含两个数据成员的对象向量进行排序
使用lambda函数进行向量排序,当不在同一范围内时如何传递变量来捕获组?