实例的排序向量
Sorting vector of instances
我目前正在大学上编码课,他们对家庭作业有非常具体的要求。
本周我们有一个名为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而不是函数指针,但在现阶段您不必担心这一点。
- 将结构向量排序为子组
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 如何在对向量排序后更改索引值?c++
- C++向量排序给出0作为输出
- 将许多向量排序在一起
- 根据一个向量对多个向量排序
- 编译错误向量排序和联合
- C++我自己的函数进行向量排序
- 将字符串的向量排序为日期"yyyymmdd"
- C++ 通过使用旧向量进行预排序来改进向量排序
- C 向量排序 .h .cpp中的单独文件
- 向量排序-c++
- 将向量排序到一个无序映射c++11中
- 向量的向量排序
- c++向量排序方法编译失败,返回预期表达式
- 如何对bitset向量排序
- 向量排序的基础上只有先
- 我如何以相同的方式对两个向量排序,而条件只使用其中一个向量
- 列表排序和结构体向量排序之间的性能差距.c++
- 如何基于第二个字符串对字符串向量的向量排序