Сортировка вектора векторов без компаратора или лямбда-функции? - PullRequest
1 голос
/ 09 января 2020

Сегодня я наткнулся на некоторый код 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 ().

Однако тот факт, что этот код скомпилирован, заставил меня захотеть задать этот вопрос; есть компаратор по умолчанию для векторов целых чисел? Есть ли один для поплавков, парных и так далее? Или компилятор автоматически его генерирует? Следует отметить, что такого способа сортировки векторов в Интернете нигде нет.

Заранее спасибо!

Ответы [ 2 ]

10 голосов
/ 09 января 2020

Из cppreference на std::sort, для перегрузки void sort( RandomIt first, RandomIt last );:

1) Элементы сравниваются с использованием operator<.

std::vector<T> обеспечивает operator<. Его поведение:

Сравнивает содержимое lhs и rhs лексикографически. Сравнение выполняется функцией, эквивалентной std :: lexicographic_compare.

Перегрузка std::lexicographical_compare, которая не использует компаратор:

1) Элементы сравниваются с использованием operator<.

Так что, пока тип T в std::vector<T> сопоставим с operator<, тогда std::vector<T> может быть по сравнению с operator< и, следовательно, совместим с std::sort. Поскольку int сравнимо с operator<, то std::vector<int> и, следовательно, std::vector<std::vector<int>>. Каждый из этих типов будет работать с std::sort без явного компаратора.

7 голосов
/ 09 января 2020

Насколько я знаю, в C ++ нет компаратора по умолчанию для векторов ...

Для vector s определены

определены операторы сравнения https://en.cppreference.com/w/cpp/container/vector/operator_cmp

std::vector определил операторы == != < <= > >=.

Поскольку это класс шаблона, вам не нужно определять operator< для всех возможных тип, который может содержать vector. Если тип соответствует LessThanComparable требованиям, он будет сгенерирован.

Поскольку int, очевидно, можно сравнить с <, для vector<int> будет сгенерировано operator<.

...