排序实例的矢量

时间:2016-01-07 14:00:17

标签: c++ sorting stl

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

本周我们有一个名为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:我们需要使比较器函数成为类

的成员

3 个答案:

答案 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而不是函数指针,但在这个阶段你不一定会担心它。