Как отсортировать массив структур по значению включенного указателя - PullRequest
0 голосов
/ 05 марта 2019

Моя цель - отсортировать массив структур. Структура содержит индекс клиента {1, ..., number} и указатель на значение другой структуры,

например,

for (int i = 1; i < no_orders+1; i++){
     sorting_array[i].index_order = i;
     sorting_array[i].some_vaule = &order_data[i].some_value;
                }

Здесь order_data - это массив структур, содержащий все данные о клиентах, что позволяет напрямую получить доступ к переменным данным о клиенте и индексу. Массив sorting_array предназначен для сортировки в соответствии со значением в order_data; поэтому указатель в DATA_TO_SORT, чтобы избежать копирования, поскольку эта функция вызывается миллионы раз (одни и те же индексы, измененные значения).

Фактическая проблема появляется с функцией сортировки. Если я использую не указатель, а реальное значение (int some_value, включая копирование, однако), сортировка работает как следует.

Определяя some_value в качестве указателя, std::sort завершается через несколько секунд без обратной связи всей программы. На самом деле вопрос в том, почему и что я могу изменить.

struct DATA_TO_SORT {

        int index_order;
        int *some_value;
    };

    bool compare_by_val( DATA_TO_SORT &a,  DATA_TO_SORT &b) {

        return *a.some_value > *b.some_value;
    }

    void sort_acc_release() {
        std::sort(sorting_array.begin() + 1, sorting_array.end(), compare_by_val);
    }

Также попробовал следующее из связанной темы, однако, показанное утверждение об ошибке встречается - помимо нескольких похожих сообщений об ошибке.

std::sort(sorting_array.begin() + 1, sorting_array.end(), [&](size_t a, size_t b) {return *sorting_array[a].some_value > *sorting_array[b].some_value; });

:: operator () (:: size_t, :: size_t) const ". сообщество \ vc \ tools \ msvc \ 14.12.25827 \ include \ xutility 1017

Минимальный пример, который работает.

#include <iostream>   
#include <cstdlib>  //rand
#include <algorithm>  //swap etc
#include <array>    //array


struct OTHER_DATA {

    int other_data;
};

struct DATA_TO_SORT {

    int index_order;
    int *some_value;
};

bool compare_by_val(DATA_TO_SORT &a, DATA_TO_SORT &b) {

    return *a.some_value > *b.some_value;
}


int main() {

    const int max_no = 10;

    std::array<OTHER_DATA, max_no> some_other_values;
    std::array<DATA_TO_SORT, 10> sorting_array;

    for (int i = 0; i < some_other_values.size(); i++)
    {
        some_other_values[i].other_data = i * 5;
        sorting_array[i].index_order = i;
        sorting_array[i].some_value = &some_other_values[i].other_data;
    }


    for (int i = 0; i < sorting_array.size(); i++)
    {
        std::cout << "\n" <<  sorting_array[i].index_order << "\t" << *sorting_array[i].some_value;
    }
    std::sort(sorting_array.begin(), sorting_array.end(), compare_by_val);


    for (int i = 0; i < sorting_array.size(); i++)
    {
        std::cout << "\n" << sorting_array[i].index_order << "\t" << *sorting_array[i].some_value;
    }


    system("pause");
    return 0;
}

Заранее благодарим за ответы на ваши вопросы, связанные с проблемами и из лучших побуждений!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...