Сортировка класса класса С++

Сортировка класса класса С++

У меня есть объект массива, который записывает следующее.

Это значение classone.h

ClassOne
{
string name;
int data;
float valueData;
}

и конструктор создается с classone.cpp

В main.cpp я создал массив ClassOne размером 10

#include "classone.h"

ClassOne cone[10];

Далее я записал несколько значений объекту

и теперь ClassOne получил 3 объекта

cone[0]
name = "hello"
data = 1
valueData = 20

cone[1]
name = "panda"
data = 2
valueData = 15

cone[2]
name = "joe"
data = 3
valueData = 25

То, что я хочу достичь, это сделать сортировку, которая может изменить этот массив с помощью valueData​​strong > самой высокой восходящей формы, так что это будет

cone[2], затем cone[0], затем cone[1]..

но проблема, если я использую сортировку пузырьков, я попробовал Google и нашел некоторые, они сортируются, например, int a[]={9,6,5,23,2,6,2,7,1,8};

но я хочу сортировать по классу массива. и переустановите значение вместе, как мне это достичь.

Итак, когда я cout будет

-- Highest to lowest --
1) Name: Joe , Data = 3, Value =25
2) Name: Hello , Data =1 , Value = 20
3) Name: Panda, Data = 2, Value = 15

Спасибо за помощь и руководство!

Ответ 1

Самый простой способ - использовать стандартную библиотеку:

#include <algorithm>

std::sort(cone, cone + 10,
          [](ClassOne const & a, ClassOne const & b) -> bool
          { return a.value < b.value; } );

Если вы хотите определить оператор сравнения по всему миру, вам даже не понадобится лямбда:

bool operator<(ClassOne const & a, ClassOne const & b)
{
    return a.value < b.value;
}

std::sort(cone, cone + 10);

Или вы можете сделать компаратор функцией-членом. Или вы могли бы дать функции компаратора настраиваемое имя и передать это как третий аргумент sort. Это может быть хорошей идеей в случае, когда сравнение является специфическим для вашей ситуации, а не "естественным":

bool ValueCmp(ClassOne const & a, ClassOne const & b)
{
    return a.value < b.value;
}

std::sort(cone, cone + 10, ValueCmp);

Последняя версия полезна, если у вас нет поддержки С++ 11 (для lambdas, как в первом случае), или если вы хотите повторно использовать компаратор в нескольких разных ситуациях.

Ответ 2

Используйте std::sort и подходящую функцию/функтор сортировки:

bool comp(const ClassOne& lhs, const ClassOne& rhs)
{
  return lhs.valueData < rhs.valueData;
}

std::sort(cone, cone+10, comp);

или, в С++ 11,

std::sort(std::begin(cone), std::end(cone), comp);

Ответ 3

Вы можете создать структуру, которая реализует метод operator <, который std::sort в заголовке <algorithm> использует для сортировки итерированных элементов.

struct One {
string name;
int data;
float valueData;

bool operator < (const one &a) const{
return valueData <a.valueData;
}

};

тогда все, что вам нужно сделать, - создать массив этой структуры и отсортировать ее с помощью функции сортировки

Ответ 4

Посмотрите на свой источник сортировки Bubble. В какой-то момент он будет сравнивать один int с другим, возможно, с меньшим оператором (<) или большим, чем оператор ( > ). То, что функция сортировки определяет относительный порядок этих двух элементов. Повторяя это сравнение много раз, функция сортировки может определить общий порядок коллекции.

Вам нужно заменить эту операцию своей собственной функцией сравнения. Функция, которая принимает два объекта вашего класса и возвращает true, если первое должно считаться меньше второго, false, если второе должно считаться меньше первого, а false, если они должны считаться эквивалентными.

Ответ 5

Вы должны определить оператор сравнения для своего класса. Как вы определяете, является ли один объект меньше другого, непонятно из вашего вопроса.