Страницы

Поиск по вопросам

вторник, 18 февраля 2020 г.

Сортировать вектор структур [закрыт]

#cpp #сортировка #cpp11 #stl


        
             
                
                    
                        
                            Закрыт. Этот вопрос необходимо уточнить или дополнить
подробностями. Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Добавьте больше подробностей
и уточните проблему, отредактировав это сообщение.
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        
Отсортировать вектор по одному из полей, используя алгоритмы STL.
По возможности использовать все перегрузки сортировки (фраза, которую я не понял).

struct Dot
{
    double x,y,z;
};

std::vector numbers = {
    {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::vector numbers = { {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. Инклюды не писал, чтобы сократить код.

Комментариев нет:

Отправить комментарий