Моя цель - отсортировать массив структур. Структура содержит индекс клиента {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;
}
Заранее благодарим за ответы на ваши вопросы, связанные с проблемами и из лучших побуждений!