#cpp #сортировка #cpp11 #stl
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются. Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение. Закрыт 2 года назад. Отсортировать вектор по одному из полей, используя алгоритмы STL. По возможности использовать все перегрузки сортировки (фраза, которую я не понял). struct Dot { double x,y,z; }; std::vectornumbers = { {123.0, 48.55, 0}, {-128.1, 0, 49.55}, {0,134.0,-59.1} }; Здесь пример очень похож на правду, но я не могу свести до моей задачи.
Ответы
Ответ 1
По возможности использовать все перегрузки сортировки (фраза, которую я не понял). В C++ функции могут быть перегружены - иными словами несколько функций с одним и тем же именем но разной сигнатурой могут одновременно быть определены в коде, и затем вызваны соответствующим образом. В данном случае в роли такой функции должна выступать функция из стандартной библиотеки - std::sort(...) Касательно вашей задачи - чтобы сортировать точки по какому-то полю (или координате), компилятору необходим "объяснить" как сравнивать точки (то есть структуры Dot) - это можно сделать аж тремя способами: Создать кастомный компаратор, перегрузив оператор () вызова функции (устаревший вариант) struct Dot { double x,y,z; }; std::vectornumbers = { {123.0, 48.55, 0}, {-128.1, 0, 49.55}, {0,134.0,-59.1} }; struct pred { bool operator()(const Dot& dot1, const Dot& dot2) { return dot1.x < dot2.x; } }; int main() { std::sort(numbers.begin(), numbers.end(), pred()); for (int i = 0; i < numbers.size(); ++i) std::cout << numbers[i].x << " " << numbers[i].y << " " << numbers[i].z << '\n'; return 0; } Перегрузить оператор < //... bool operator < (const Dot& dot1, const Dot& dot2) { return dot1.x < dot2.x; } int main() { std::sort(numbers.begin(), numbers.end()); for (int i = 0; i < numbers.size(); ++i) std::cout << numbers[i].x << " " << numbers[i].y << " " << numbers[i].z << '\n'; return 0; } Передать лямбду (раз уж вы указали 11-ый стандарт) в функцию сортировки из STL //... int main() { std::sort(numbers.begin(), numbers.end(), [](const Dot& dot1, const Dot& dot2) -> bool { return dot1.x < dot2.x; } ); for (int i = 0; i < numbers.size(); ++i) std::cout << numbers[i].x << " " << numbers[i].y << " " << numbers[i].z << '\n'; return 0; } P.S. Инклюды не писал, чтобы сократить код.
Комментариев нет:
Отправить комментарий