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

问题描述 投票:0回答:2

今天我遇到了一些我认为不会编译的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 ++中没有用于整数矢量的默认比较器,因此为了将其传递给sort()函数,必须实现自定义比较器或lambda函数。

但是,这段代码已编译的事实使我想问这个问题;整数向量有默认的比较器吗?有浮子,双打等等吗?还是编译器自动生成它?应当指出,这种对向量的向量进行排序的方法在网上找不到。

提前感谢!

c++ sorting vector lambda comparator
2个回答
5
投票

std::sort上的cppreference开始,对于重载std::sort

1)使用void sort( RandomIt first, RandomIt last );比较元素。

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

从字典上比较operator<operator<的内容。比较是通过等效于std :: lexicographical_compare的函数执行的。

lhs的不带比较器的过载行为是:

1)使用rhs比较元素。

只要std::lexicographical_compare中的std::lexicographical_compare类型与operator<具有可比性,那么T就可以与std::vector<T>比较,因此与operator<兼容。由于std::vector<T>可与operator<相提并论,因此std::sort也是如此,因此int也是如此。这些类型中的每一种都可以在没有显式比较器的情况下与operator<一起使用。


4
投票

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

std::vector<int>定义了比较运算符:

std::vector<std::vector<int>>

[std::sort定义了运算符vector

因为它是模板类,所以不需要为https://en.cppreference.com/w/cpp/container/vector/operator_cmp可以容纳的每种可能的类型定义std::vector。如果类型符合== != < <= > >=要求,则将生成它。

由于operator<显然可以与vector进行比较,因此LessThanComparable将为其生成int

© www.soinside.com 2019 - 2024. All rights reserved.