@kvendingoldo

Как сделать сортировку вектора структур по произвольному полю?

Есть свой вектор типа структура :
vector<peopleData>studentData;
Хочу написать шаблон сортировки Шелла и с помощью него отсортировать вектор по некоторым полям.
Шаблон получился такой(не дописанный):
template <typename field>// 
void shellSort( vector<myStruct> &arr, int size )
    {
 
    int step = size / 2;
    while (step > 0)
    {
      for (int i = 0; i < (size - step); i++)
                {
                    int j = i;
                    while (j >= 0 && arr[j] > arr[j + step])
                    {
                        int temp = arr[j];
                        arr[j] = arr[j + step];
                        arr[j + step] = temp;
                        j--;
                    }
                }
                step = step / 2;
            }   
    }


Вопрос: как правильно передать поле, по которому я хочу сортировать?
  • Вопрос задан
  • 5451 просмотр
Решения вопроса 2
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Если компилятор поддерживает С++11, lambda хороший способ сделать это.
#include <iostream>

struct A
{
   int field;
};

template <typename T, typename Cmp>
void f(T const&a, T const&b, Cmp const &cmp)
{
   if (cmp(a, b))
      std::cout << "Less" << std::endl;
   else
      std::cout << "Eq or more" << std::endl;
}

int main()
{
   A a = {2};
   A b = {1};
   f(a, b, [](A const &left, A const &right){return left.field < right.field;});
}
Ответ написан
Комментировать
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Перегрузить оператор сравнения
или передавать в shellSort функцию-сравнятор
bool comparer(const myStruct &a,const myStruct &b){
return a.somefield > b.somefield
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Сделайте как сделано в STL: передайте функтор, сравнивающий два объекта, а он уж пусть сравнивает что пользователю нужно.
Типа второго шаблона тут: en.cppreference.com/w/cpp/algorithm/sort
Ответ написан
Комментировать
@Adler3D
Ещё можно сделать макрос который принимает имя поля как параметр и при вызове генерирует шаблонную функцию которая сортирует любой вектор структур в котором есть поле с заданым именем.
как-то так:
#define GenShellSortForField(FIELD)template<typename TYPE>         \
  void shellSortForField_##FIELD(vector<TYPE>&arr,int size)        \
  {                                                                \
    int step=size/2;                                               \
    while(step>0)                                                  \
    {                                                              \
      for(int i=0;i<size-step;i++)                                 \
      {                                                            \
        int j=i;                                                   \
        while(j>=0&&arr[j].FIELD>arr[j+step].FIELD)                \
        {                                                          \
          std::swap(arr[j],arr[j+step]);                           \
          j--;                                                     \
        }                                                          \
      }                                                            \
      step/=2;                                                     \
    }                                                              \
  }
...
GenShellSortForField(x);
Ответ написан
@kvendingoldo Автор вопроса
Всем спасибо. Решил с помощью лямбды.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы