我有一个列表,其中包含用多个参数定义的对象Studenti。 我想对这个学生名单进行排序,首先是他们的平均值,如果手段相同,我会按字母顺序排序。
在我的班级学生中我声明了这个头部功能:
bool mediaDescrescator(const&, const&);
这是以这种方式实现的:
bool Studenti::mediaDescrescator(const Studenti& a, const Studenti& b)
{
if(a.medie_ != b.medie_)
{
return (a.medie_ > b.medie_);
}
return (a.nume_ > b.nume_);
}
medie_
是Studenti的双重私人会员
nume_
是Studenti的std :: string私有成员
主要我有一个Studenti列表:
std::list<Studenti> listaStud_ = {stud1, stud2, stud3, stud4, stud5};
功能调用:
std::sort(listaStud_.begin(), listaStud_.end(), mediaDescrescator);
我的错误是:mediaDescrescator未在此范围内声明。
我已经看过关于这种排序的其他主题,并且它们被宣布为我的,我尝试使用矢量类型而不是列表。
mediaDescrescator
被称为without(),因为它必须作为函数指针或函数对象传递。
答案 0 :(得分:5)
mediaDescrescator
是Studenti
的成员函数。它是根据类的词法范围定义的。因此,您可以访问Studenti::mediaDescrescator
,但不能访问mediaDescrescator
。全局命名空间中没有名为mediaDescrescator
的函数。
此外,为了避免您可能遇到的下一个错误,请确保它是static
成员函数。毕竟,你不需要一个有效的实例来调用它。它无法访问this
的任何成员变量。
答案 1 :(得分:5)
std::tie
会返回std::tuple
个引用。
std::tuple
定义执行正确词典比较的比较运算符。
所以你需要做的就是将Studenti
变成tuple
tie
- 然后比较元组。
bool Studenti::mediaDescrescator(const Studenti& a, const Studenti& b)
{
return std::tie(a.medie_, a.nume_) > std::tie(b.medie_, b.nume_);
}
您可能会发现在您编写的类上提供名为as_tuple()
的方法很有用:
struct Studenti
{
// rest of class
auto as_tuple() const { return std::tie(medie_, nume_); }
};
答案 2 :(得分:2)
您的实施存在一些问题。第一个,也就是编译器抱怨的那个是mediaDescrescator
在Studenti
范围内定义,并且您尝试在全局范围内访问它,使用Studenti::mediaDescrescator
来获取指针它。其次,mediaDescrescator
是Studenti
的正常成员函数,因此需要在对象上调用它。这可以是固定的,例如通过使其成为静态成员函数,或者通过使其获取一个参数并与当前对象进行比较。第三,std::sort
函数不能应用于std::list
,因为它需要随机访问迭代器,std::list
只提供双向迭代器。
答案 3 :(得分:1)
将功能声明更改为:
bool mediaDescrescator(const Studenti& a, const Studenti& b)
基本上它在课外。
如果您不想公开会员,请为他们编写getter函数,并在排序中使用它们。
答案 4 :(得分:1)
首先,如果mediaDescrescator()
是一个非静态成员函数,它只需要一个&#34;其他&#34;参数,因为它可以使this
成员工作。
其次,lambdas很容易让算法与成员函数一起工作(未经测试):
listaStud_.sort([](const studenti& a, const studenti& b) { return a.mediaDescrescator(b); });
你也可以直接在lambda中实现订单功能,与Richard Hodges&#39;回答(在这种情况下与公众成员):
listaStud_.sort([](const studenti& a, const studenti& b) { return std::tie(a.medie_, a.nume_) > std::tie(b.medie_, b.nume_); });
根据约翰的答案:std::sort
无法在std::list
上使用,请使用std::list<>::sort()
代替我的代码段。