Сортировать вектор структур

221
10 июня 2017, 15:28

Отсортировать вектор по одному из полей, используя алгоритмы STL. По возможности использовать все перегрузки сортировки (фраза, которую я не понял).

struct Dot
{
    double x,y,z;
};
std::vector<Dot> numbers = {
    {123.0, 48.55, 0},
    {-128.1, 0, 49.55},
    {0,134.0,-59.1}
};

Здесь пример очень похож на правду, но я не могу свести до моей задачи.

Answer 1

По возможности использовать все перегрузки сортировки (фраза, которую я не понял).

В C++ функции могут быть перегружены - иными словами несколько функций с одним и тем же именем но разной сигнатурой могут одновременно быть определены в коде, и затем вызваны соответствующим образом.

В данном случае в роли такой функции должна выступать функция из стандартной библиотеки - std::sort(...)

Касательно вашей задачи - чтобы сортировать точки по какому-то полю (или координате), компилятору необходим "объяснить" как сравнивать точки (то есть структуры Dot) - это можно сделать аж тремя способами:

  1. Создать кастомный компаратор, перегрузив оператор () вызова функции (устаревший вариант)

    struct Dot
    {
        double x,y,z;
    };
    std::vector<Dot> 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;
    }
  2. Перегрузить оператор <

    //...
    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;
    }
  3. Передать лямбду (раз уж вы указали 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.

Инклюды не писал, чтобы сократить код.

READ ALSO
С++, эффект кэширования [требует правки]

С++, эффект кэширования [требует правки]

Задание: Оценить эффект кэширования

184
Как настроить свои переходы?

Как настроить свои переходы?

Как карусели bxslider (плагин для jQuery) настроить свои переходы между слайдами? Там есть переходы по слайдам вперёд и назад, мне нужно использовать...

290
Редактировать выделенный текст

Редактировать выделенный текст

Мне надо, чтобы при нажатии shift+P в textarea выделенный текст оборачивался в теги pТо есть

286