C++ 结构数组的排序和二进制搜索

C++ 结构数组的排序和二进制搜索,c++,sorting,binary-search,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->da

这是我的密码

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++;
    }

}
第二行开始排序

20130101 Wii 0 ....
第二个问题是二进制搜索

我的代码有什么错误吗

错误消息显示


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

请发布所有代码好吗? 目前,您的结构的指针没有分配内存,如果没有所有代码,我们无法获得与您相同的结果

错误消息显示

布尔(常量数据*,常量数据*)无法将arg1“常量int”转换为“常量数据*”

应该出现,因为您可以向函数传递“const int”而不是“const Data*”

  • 关于第一行的打印,可能是第一个元素,即
    p_data[0]
    被错误地初始化(可能是随机值),这将使元素具有随机
    int
    as
    date
    和空字符串as
    exchange

  • 您收到的错误是,将
    binary_search
    ()的值设置为
    20140212
    ,而不是包含该日期的
    Data
    对象(我猜您希望找到该日期对应的对象)

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

    //创建一个目标日期为的临时变量
    数据tmp;
    tmp.date=20140212;
    //搜索它
    bool yes=二进制搜索(P_data.begin()+1,P_data.end(),&tmp,comp2);
    

    也可以考虑将<代码>日期>代码>属性改为“代码>未签名< /代码>以避免奇怪的负值。

    我认为这更适合评论部分。我同意你的观点,尽管我实际上没有赢得足够的声誉来发表评论。但是我想帮助他,今天下午我将去掉这个答案,以确定他是谁。读过了。@t.m
    20130101 Wii 0 ....