C++ 实例排序向量

C++ 实例排序向量,c++,sorting,stl,C++,Sorting,Stl,我目前在大学上编码课,他们对家庭作业有非常具体的要求 本周我们有一个名为Npt的课程,代表一位诺贝尔奖获得者。本课程包括获奖者的姓名、获奖年份以及获奖者的领域 现在我们应该创建另一个类,Nobelpreise,它包含一个容器,用于存储上述诺贝尔奖得主类的实例。我们应该在诺贝尔奖颁发的那一年对容器中的元素进行分类 我无法正确使用带有自定义比较器的std::sort函数。我的代码大致如下所示: class Nobelpreise { private: int numb; vector<Np

我目前在大学上编码课,他们对家庭作业有非常具体的要求

本周我们有一个名为
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());}  
 };
需要两个参数。它们不应该由sort函数提供吗?
我还尝试重载
使您的方法
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 ); }
};

首先,我们将修复获取列表的两个实例的错误:

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
的对象指针调用它。由于它的实现没有使用
这个
,所以可以将其设置为静态方法。更好的是,它不使用任何私有成员,因此可以在任何类之外成为自由函数:

// 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;
}
//我已将其重命名,以说明其功能
前一年(施工期Npt&a、施工期Npt&b){
返回a.get_jverl()

<>这应该足够帮助你前进了。

< P>你没有说哪种版本的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()
});
排序(Npl.get_xx().begin(),Npl.get_xx().end(),[](常数Npt&lhs,常数Npt&rhs){ 返回lhs.get_jverl()
您可以按照Rabbid的建议,将此代码放入Nobelpreise类的排序方法中


与这里的其他方法相比,我认为它使代码更具可读性,因为您可以看到内联比较的内容,而不必跳转到一个新函数来读取更多的代码行(当然,假设该函数没有在其他任何地方使用)。它还使代码更快,因为您传递的是lambda而不是函数指针,但在此阶段您不必担心这一点。

祝贺您。您正在将指向类成员的两个不相关副本的两个迭代器传递给
sort
。这真的很糟糕……编译器说,
mycomp
,而不是
sort
,需要两个参数。排序时不要调用该函数,只需传递它即可。并使其成为一个自由函数而不是成员函数。调用
.end()
。。。您不需要
numb
,因为您可以获得
xx.size()
。事实上,你根本不需要这个类:)你完全正确,问题是练习的要求太严格了。谢谢你的回答,但是,如果我执行你的代码,我仍然无法让它工作,因为我得到一个通过的'const Npt'作为'int Npt::get_verl()'的'this'参数丢弃限定符[-fppermissive]。我的Npt类中有错误吗?谢谢,不管怎样,每当我尝试你的第一个建议时,我的代码中仍然有一个错误,我得到一个错误,它说:从“const Npt”类型的表达式中初始化“Npt&”类型的引用无效,这意味着什么,我做错了什么?好的,酷,现在代码符合要求,但在执行脚本时仍然会出现错误:分段错误(核心转储)比较器通常应该通过常量引用而不是值或引用获取内容。另外,我知道你想给出OP选项,但是将struct作为比较器是非常单一和奇怪的。我做错了什么?
// 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;
}
std::sort(Npl.get_xx().begin(), Npl.get_xx().end(), [](const Npt& lhs, const Npt& rhs) {
  return lhs.get_jverl() < rhs.get_jverl()
});