我正在尝试将文件中的数据存储到对象向量中,然后对数据成员进行排序,但我得到错误“无法确定哪个重载函数实例”排序“是”。我尝试过使用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;
}
答案 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.
}
};