如何根据包含的指针的值对结构数组进行排序

时间:2019-03-05 15:00:03

标签: c++ arrays sorting pointers structure

我的目的是对结构数组进行排序。该结构包含客户{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,但包括复制工作量),则排序应按预期进行。

std::sort将some_value定义为指针,几秒钟后终止,而整个程序没有任何反馈。实际的问题是为什么以及我可能会改变什么。

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“:Konvertierung von Argument 1 von” DATA_TO_SORT“ in” :: size_t“ nichtmöglichAlgorithm ... \ Microsoft Visual Studio \ 2017 \社区\ 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;
}

提前感谢您提出的与问题相关且意图明确的答案!

0 个答案:

没有答案