C++ 使用std::sort对包含两个数据成员的对象向量进行排序

C++ 使用std::sort对包含两个数据成员的对象向量进行排序,c++,algorithm,sorting,vector,comparison,C++,Algorithm,Sorting,Vector,Comparison,我试图将文件中的数据存储到对象向量中,然后对数据成员进行排序,但我得到的错误是“无法确定要使用哪个重载函数实例”sort”。我曾尝试将lambdas与sort结合使用,并认为这可能是我创建比较函数的方式(是a.hour>b.hour,还是应该使用a.getHour()和b.getHour()?),我实际上希望按小时和分钟对向量进行排序,但仅在小时内进行测试似乎不起作用。这就是我目前所拥有的 #include <iostream> #include <vector> #in

我试图将文件中的数据存储到对象向量中,然后对数据成员进行排序,但我得到的错误是“无法确定要使用哪个重载函数实例”sort”。我曾尝试将lambdas与sort结合使用,并认为这可能是我创建比较函数的方式(是a.hour>b.hour,还是应该使用a.getHour()和b.getHour()?),我实际上希望按小时和分钟对向量进行排序,但仅在小时内进行测试似乎不起作用。这就是我目前所拥有的

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <fstream>
using namespace std;

class time {
    int hour;
    int minute;
public:
    time(int h, int m) {
        hour = h;
        minute = m;
    }
    int getHour() { return hour; }
    int getMinute() { return minute; }
};

class Times {
    vector<time> t;
public:
    Times(string fileName) {
        //
    }

    void parse(ifstream& file) {
        //
        sort.(t.begin(), t.end(), lowerThan);
        //sort.(t.begin(), t.end(), [] (time& a, time& b) { return a.hour < b.hour; })
    }

    void display() {
        for (size_t i = 0; i < t.size(); i++) {
            cout << t[i].getHour() << ":" << t[i].getMinute() << endl;
        }
    }

    static bool lowerThan(time& a, time& b) { return a.getHour() < b.getHour(); }
};

int main() {
    Times times("File.txt");
    times.display();

    system("pause");
    return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
上课时间{
整小时;
整数分钟;
公众:
时间(整数小时,整数米){
小时=小时;
分钟=m;
}
int getHour(){return hour;}
int getMinute(){return minute;}
};
上课时间{
向量t;
公众:
时间(字符串文件名){
//
}
无效解析(ifstream和file){
//
排序。(t.begin(),t.end(),lowerThan);
//排序。(t.begin(),t.end(),[](time&a,time&b){返回a.hourcout您的代码中有几个问题

您需要避免名称冲突

此外,不幸的是,您的
时间
(小写)类与另一个
时间
标准标识符冲突。只需使用
大写
约定命名类即可

此外,您可能希望将
Time::getHour()
Time::getMinute()
方法标记为
const
,因为它们不会修改
Time
对象的内部状态

由于在
sort
之后有一个点,因此在
sort
调用中也有一个打字错误

而且,在C++11/14中,我建议您对
循环使用基于范围的
,而不是对
使用带整数索引的显式

考虑到这些方面,我对您的代码进行了一些重构,并且使用了
lowerThan()
静态方法和lambda。请随意研究它

#include <algorithm>
#include <iostream>
#include <vector>

class Time {
    int hour;
    int minute;
public:
    Time(int h, int m) : hour(h), minute(m) {
    }

    int getHour() const { return hour; }
    int getMinute() const { return minute; }
};

class Times {
    std::vector<Time> t;

    static bool lowerThan(const Time& a, const Time& b) { 
        return a.getHour() < b.getHour(); 
    }

public:
    Times() {
        // Test data
        t.push_back(Time{10, 10});
        t.push_back(Time{9, 20});
        t.push_back(Time{8, 30});

        //std::sort(t.begin(), t.end(), lowerThan);

        std::sort(t.begin(), t.end(), [] (const Time& a, const Time& b) { 
            return a.getHour() < b.getHour(); 
        });
    }

    void display() {
        for (const auto& x : t) {
            std::cout << x.getHour() << ":" << x.getMinute() << '\n';
        }
    }
};

int main() {
    Times times;
    times.display();
}

编辑


正如@DieterLücking在一篇评论中所建议的,您可以首先使用
运算符。其次,它看起来像是输入错误。您有
排序。(…
不是
排序(…
避免
使用名称空间std
,当您将
std
中使用的名称用作
time
时,情况会更糟。您好,我在好几个地方看到过这一点,但为什么要避免使用名称空间std;?@FirstStep查看我的评论BTW中的链接,即使没有
使用名称空间std;
,您的类
time
似乎也存在冲突无论如何,使用(C)函数
time
,请使用您自己的名称空间,或重命名您的类
time
。排序:
std::tie(a.hour,a.minute)
std::make_tuple(a.getHour(),a.getMinute())
如果操作员不是朋友
class Time {
...
    friend bool operator<(const Time& a, const Time& b) {
        return a.getHour() < b.getHour();
        // ... or a more complete comparison, including minutes.
    }   
};
#include <tuple>  // for std::tie

class Time {
    ...
public:

friend bool operator<(const Time& a, const Time& b) {
    return std::tie(a.hour, a.minute) < std::tie(b.hour, b.minute);
}   

};