C ++ сортировка вектора структур - PullRequest
0 голосов
/ 27 сентября 2018

Я новичок в C ++ и пытаюсь отсортировать вектор на основе значений в другом векторе.Я пытаюсь реализовать это путем создания вектора структур и сортировки вектора структур с использованием STL.Структуры имеют 2 элемента данных, один - CustomType, а другой - int.Я хочу, чтобы это сортировалось в порядке убывания поля int и поэтому включило перегрузку булевого оператора, чтобы можно было использовать сортировку STL (алгоритм).

Структура создается в функции с использованием ссылок на CustomTypeвектор и изначально неинициализированный int-вектор, и объединение их в вектор структур.Значения для ints получаются путем вызова отдельной функции-члена SomeClass (SomeFunc) для каждого элемента вектора CustomType и другого параметра u_int8_t (эта функция работает сама по себе).

В конце я хочузаменить отсортированные объекты CustomType на основе отсортированной последовательности структуры.

Файл реализации (.cpp) имеет следующую функцию:

void SomeClass::orderFunc(std::vector<CustomType>& x, std::vector<int>& y, u_int8_t param){
    std::vector<CustomStruct> xy_vec;
    y.assign(x.size(), 0);   
    int count  = int(x.size());

    for(int i=0; i != count; ++i){
        y[i] = SomeFunc(x[i], param);
    }

    for(int i = 0; i != count; ++i){
        xy_vec[i].var1 = x[i];
        xy_vec[i].var2 = y[i];
    }
    std::sort(xy_vec.begin(), xy_vec.end()); 
    for(int i = 0; i != count; ++i){
        x[i] = xy_vec[i].var2;
    }
}

Структура определяется в заголовочном файле SomeClass какниже:

struct CustomStruct{
        CustomType var1;
        int var2;
        bool operator>(const CustomStruct& a) const{
            return (this->var2 > a.var2);
        }
    };

Когда эта функция вызывается, я получаю следующую ошибку:

недопустимые операнды для двоичного выражения

оператор bool () (const _T1 &__x, const _T1 & __y) const {return __x <__y;} </p>

Я не могу понять, почему перегрузка оператора bool недопустима, учитывая, что это определяется для поля int структуры.

Чего мне не хватает?Любая помощь будет оценена.Кроме того, любые предложения для более элегантного способа сделать это были бы также хороши.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

std::sort имеет две основные перегрузки: одна без предиката сортировки, который по умолчанию использует operator <, а другая с предикатом сортировки (подробности здесь ).

Так что вы можете написатьчто-то вроде

struct CustomStructCmp {
    bool operator()(const CustomStruct& a, const CustomStruct& b) const
    {   
        return a.var2 > b.var2;
    }   
};

std::sort(xy_vec.begin(), xy_vec.end(), CustomStructCmp());

(если вы используете C ++ 11, то вместо этого вы можете использовать лямбду).

В качестве альтернативы вы можете написать

std::sort(xy_vec.begin(), xy_vec.end(), std::greater<CustomStruct>());

, но ячувствую, что более естественно напрямую использовать функтор / лямбду, а не определять operator> и использовать функтор std::greater.

0 голосов
/ 27 сентября 2018

Вам необходимо перегрузить operator<, а не operator>

bool operator<(const CustomStruct& a) const
{
    return (this->var2 < a.var2);
}

РЕДАКТИРОВАТЬ: Для сортировки в обратном порядке необходимо позвонить std::sort с rbegin() и rend() (обратными) итераторами:

std::sort(xy_vec.rbegin(), xy_vec.rend()); 

РЕДАКТИРОВАТЬ (опять же, поскольку вопрос слишком длинный, имеет 2 проблемы):

Вектор xy_vec пуст, вам нужно позвонить resize:

std::vector<CustomStruct> xy_vec;
// Resize here
xy_vec.resize(count);
for(int i = 0; i != count; ++i){
    xy_vec[i].var1 = x[i];
    xy_vec[i].var2 = y[i];

Или вы можете позвонить push_back - я вам все это не говорю.Пожалуйста, найдите!

...