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

时间:2016-03-15 17:48:00

标签: c++ algorithm sorting vector comparison

我正在尝试将文件中的数据存储到对象向量中,然后对数据成员进行排序,但我得到错误“无法确定哪个重载函数实例”排序“是”。我尝试过使用lambdas并且也认为它可能是我创建比较函数的方式(是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;
}

1 个答案:

答案 0 :(得分:2)

您的代码中存在多个问题。

should not use using namespace std;以避免名称冲突。

此外,遗憾的是,您的time(小写)类与另一个time标准标识符冲突。只需使用Uppercase约定来命名类。

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

由于Time后面有一个点,您还有一个拼写错误sort次来电。

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

考虑到这些方面,我已经使用for静态方法和lambda重构了一些代码,it now works。随意学习。

lowerThan()

另请注意,如果您为#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(); } 类的实例定义自定义operator<重载,则只需调用Time而无需任何自定义比较器,并自定义实现{{ 1}} is automatically picked up by the compiler

std::sort()

修改

根据@DieterLücking的评论中的建议,您可以使用std::tie()进行operator<实施(live here on Ideone):

class Time {
...
    friend bool operator<(const Time& a, const Time& b) {
        return a.getHour() < b.getHour();
        // ... or a more complete comparison, including minutes.
    }   
};