我目前正在大学学习编码课程,他们对家庭作业有非常具体的要求。
本周我们有一个名为Npt
的班级代表诺贝尔奖获得者。本课程除其他外,包括名称,奖品年份和获奖者的领域。
现在我们应该创建另一个类Nobelpreise
,其中包含一个容器,用于所述诺贝尔奖获奖者类的实例。我们应该在诺贝尔奖颁奖典礼之前对该容器的元素进行排序。
我无法正确使用std::sort
函数和自定义比较器。这就是我的代码大致如下:
class Nobelpreise
{
private:
int numb;
vector<Npt> xx;
public:
Nobelpreise(){numb=0;}
void add(Npt &n1){xx.push_back(n1);numb++;return;}
Npt get_nobel(int i) {return xx[i];}
vector<Npt> get_xx() {return xx;}
int get_numb(){return numb;}
~Nobelpreise(){}
bool mycomp(Npt N1, Npt N2) {return (N1.get_jverl()<N2.get_jverl());}
};
方法get_jverl()
来自Npt
类,只返回年份。
现在sort函数总是返回错误说:
sort(Npl.get_xx().begin(), Npl.get_xx().end(), Npl.mycomp)
需要两个参数。它们不应该由sort函数提供吗?
我也尝试重载<
运算符,它似乎也不起作用。
edit1:添加了end()并从Npl.mycomp
中删除了()
edit2:我们需要使比较器函数成为类
答案 0 :(得分:1)
使您的方法mycomp
成为静态,并编写一个执行排序作业的方法。
class Nobelpreise
{
private:
int numb;
vector<Npt> xx;
public:
Nobelpreise(){numb=0;}
~Nobelpreise(){}
vector<Npt>& get_xx() {return xx;}
static bool mycomp( const Npt &N1, const Npt &N2 ) { return N1.get_jverl() < N2.get_jverl(); }
//^^^^^^
void Sort() { std::sort( xx.begin(), xx.end(), &mycomp ); }
};
方法Npt::get_jverl
必须是const
returntype get_jverl() const { return ...; }
如果您在课堂外进行排序,请注意您必须在方法中返回对向量的引用:vector<Npt>& get_xx() {return xx;}
sort(Npl.get_xx().begin(), Npl.get_xx().end(), &Nobelpreise::mycomp)
答案 1 :(得分:0)
首先,我们将修复您正在获取列表的两个实例的错误:
sort(Npl.get_xx().begin(), Npl.get_xx().end, Npl.mycomp());
替换为
auto v = Npl.get_xx();
std::sort(v.begin(), v.end(), Npl.mycomp());
我已将()
添加到v.end
,因为我们想要调用它。但是,我们不意味着在此处调用Npl::mycomp()
- std::sort
想要接收函数,而不是返回值:
auto v = Npl.get_xx();
std::sort(v.begin(), v.end(), Npl::mycomp);
这仍然不起作用,因为Npl::mycomp
是一个实例方法,std::sort
不会使用this
的对象指针调用它。由于它的实现不使用this
,因此可以将其设为静态方法。更好的是,它不使用任何私有成员,因此可以在任何类之外成为自由函数:
// I've renamed this to say what it does
bool year_precedes(const Npt& a, const Npt& b) {
return a.get_jverl() < b.get_jverl();
}
class Nobelpreise; // make the full declaration available
// for the following to compile
// I've made this a nonmember, too, as it only uses public methods
vector<Npt> sorted_prizes(const Nobelpreise& p)
{
auto v = p.get_xx();
std::sort(v.begin(), v.end(), year_precedes);
return v;
}
这应该足以帮助你。
答案 2 :(得分:0)
您没有说出哪个版本的C ++,但假设C ++ 11是一个更现代的方法(与已经存在的两个答案相比)。你的要求没有提到比较器需要什么,所以不是写比较器,你可以这样做:
std::sort(Npl.get_xx().begin(), Npl.get_xx().end(), [](const Npt& lhs, const Npt& rhs) {
return lhs.get_jverl() < rhs.get_jverl()
});
你可以把这段代码放在Nobelpreise类的Sort方法中,就像Rabbid所说的那样。
与其他方法相比,我认为它使代码更具可读性,因为你可以看到内联被比较的内容,而不是只是为了读取一行代码而跳转到一个新函数(假设当然,这个功能没有在其他任何地方使用)。它还使代码更快,因为你传递的是lambda而不是函数指针,但在这个阶段你不一定会担心它。