实例的排序向量

Sorting vector of instances

本文关键字:向量 排序 实例      更新时间:2023-10-16

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

本周我们有一个名为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(Npl.get_xx().begin(), Npl.get_xx().end(), Npl.mycomp)

需要两个参数。它们不应该由排序函数提供吗?我还试图重载<运算符,但它似乎也不起作用。

edit1:添加了end()并从Npl.mycomp中删除了()
edit2:我们需要使comparator函数成为类的成员

将方法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必须是常量

返回类型get_jverl() const { return ...; }

如果您在类外进行排序,请注意,您必须在方法中返回对向量的引用:vector<Npt>& get_xx() {return xx;}

sort(Npl.get_xx().begin(), Npl.get_xx().end(), &Nobelpreise::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的对象指针来调用它。由于它的实现不使用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;
}

这应该足以帮助你。

您没有说明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()
});

正如Rabbid所建议的,您可以将此代码放入Nobelpreise类的Sort方法中。

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