Аналог Comparator.thenComparing из Java в C++
Вот немного абстрактный пример сортировки списка в Java:
Здесь идёт сортировка элементов сначала по хеш-коду, затем по их строковому представлению, затем по тому, являются ли элементы null.
То есть элементы разделяются на группы по хеш-коду, в каждой группе они сортируются по строкам и т.д.
Например, если мне нужно отсортировать список строк по длине по возрастанию, а затем в каждой группе передвинуть слова, у которых первая буква "b", вперёд, то результат будет выглядеть так:
"ara", "bra", "qwerty", "bwerty", "t", "b" -> "b", "t", "bra", "ara", "bwerty", "qwerty".
Есть ли аналог такого в C++?
Ответы (1 шт):
В stl есть алгоритмы сортировки (функция sort и др.), а специально для list есть метод sort, использование которого похоже на то, что вы приводите в вопросе. Однако есть несколько замечаний:
В c++ вы не можете хранить объекты разных типов в контейнерах. В подобных случаях это всегда будет контейнер указателей
Метод
sortвозвращаетvoid, а не ссылка на контейнер. Это означает что вы не можете поставить оператор.сразу после вызова метода сортировки и снова его вызвать уже с другими параметрами. Вам нужно будет сделать это уже в другой строке. Хотя, конечно, вы можете создать объект аналогичный приведенному в вопросе компаратору, в котором просто инкапсулируете соответствующие вызовы
Вот пример:
StringList list{"foxtrot", "charlie", "delta", "alpha", "bravo", "echo"};
// sort by string size (from lesser to greather)
auto compare1 = [](const std::string &first, const std::string &second) {
return first.size() < second.size();
};
// put all words started from `b` to front of list
auto compare2 = [](const std::string & first,
[[maybe_unused]] const std::string &second) {
return first[0] == 'b';
};
list.sort(compare1);
list.sort(compare2);
for (const std::string &str : list) {
std::cout << str << std::endl;
}
Вывод:
bravo
echo
delta
alpha
foxtrot
charlie
