对struct数组进行排序和binary_search

时间:2018-04-07 08:32:42

标签: c++ sorting binary-search

这是我的代码

typedef struct Data{
    int date;
    string currency;
    string exchange;
    float low;
    float high;
    long long int daily_cap;
}Data;

bool comp2(const Data *data1, const Data *data2){
        return (data1->date < data2->date);
}

bool comp1(Data *data1, Data *data2){
    if (data1->date != data2->date)
        return (data1->date < data2->date);
    if (data1->currency != data2->currency)
        return (data1->currency < data2->currency);
    else
        return (data1->exchange < data2->exchange);
}

int main()
{
    ifstream infile("test.txt");
    Data tmp;
    vector<Data*> P_data;

        while (infile){
        Data *tmp = new Data();
        infile >> tmp->date;
        infile >> tmp->currency;
        infile >> tmp->exchange;
        infile >> tmp->low;
        infile >> tmp->high;
        infile >> tmp->daily_cap;
        P_data.push_back(tmp);
    }

    sort(P_data.begin(), P_data.end(), comp1);

//  bool yes = binary_search(P_data.begin()+1, P_data.end(), 20140212, comp2);

    int c = 0;
    for (int i = 0; i<= 20; ++i){
        cout << P_data[i]->date << " " << P_data[i]->exchange << " " << c << endl;
        c++;
    }

}

第一个问题是为什么在排序后,

第一行将是

-842150451  0

并且第二行开始排序

20130101 Wii 0 ....

,第二个问题是binary_search

我的代码有什么问题吗?

错误消息显示

bool(const Data *,const Data *)无法转换arg1&#39; const int&#39;至&#39; const数据*&#39;

2 个答案:

答案 0 :(得分:0)

  1. 关于第一行的打印,可能是第一个元素,即P_data[0]被错误地初始化(可能是随机值),这会使元素具有随机int作为date,空字符串为exchange

  2. 您收到的错误是指binary_searchhttp://www.cplusplus.com/reference/algorithm/binary_search/)值为20140212而不是包含该日期的Data对象(I猜猜你想找到这个日期的对象。

  3. 您应该将搜索代码修改为:

    // Create a temp variable which target date
    Data tmp;
    tmp.date = 20140212;
    
    // Search for it
    bool yes = binary_search(P_data.begin()+1, P_data.end(), &tmp, comp2);
    

    此外,您可能需要考虑将date属性更改为unsigned,以避免出现奇怪的负值。

答案 1 :(得分:-1)

您能否发布所有代码? 目前你的结构指针没有分配内存,如果没有你的代码,我们就无法得到与你相同的结果。

  

错误消息显示

     

bool(const Data *,const Data *)无法将arg1'const int'转换为'const Data *'

应该出现

因为你可以将'const int'而不是'const Data *'传递给你的函数。