gpt4 book ai didi

c++ - 在 C++ 中对类的 vector 进行排序

转载 作者:太空狗 更新时间:2023-10-29 23:26:37 24 4
gpt4 key购买 nike

我在使用排序函数时遇到了一些问题...这是我的代码:

class Parola {
public:
string s;
int repetition;
bool operator()(const Parola *x, const Parola *y) {
return x->repetition > y->repetition;
}
};


int main(int argc, char** argv) {
...
vector<Parola> p;
...
some insertions here
...
sort(p.begin(), p.end(), Parola());
...
return 0;
}

为什么我不能毫无错误地编译它?非常感谢!

PS:五十多个错误我只展示前三行:

/usr/include/c++/4.2.1/bits/stl_algo.h: In function 'const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&, _Compare) [with _Tp = Parola, _Compare = Parola]':
/usr/include/c++/4.2.1/bits/stl_algo.h:2795: instantiated from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Parola*, std::vector<Parola, std::allocator<Parola> > >, _Size = long int, _Compare = Parola]'
/usr/include/c++/4.2.1/bits/stl_algo.h:2866: instantiated from 'void std::sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Parola*, std::vector<Parola, std::allocator<Parola> > >, _Compare = Parola]'

最佳答案

为 OP 提供一些可供选择的选项:(注意:并非详尽无遗)

选项1:内部运算符<()

class Parola {
public:
string s;
int repetition;
bool operator<(const Parola& x) const
{
return repetition < x.repetition;
}
}

使用默认的 std::less<> 模板调用。

sort(p.begin(), p.end());

选项 2:内部函数运算符 ()():

class Parola {
public:
string s;
int repetition;
bool operator()(const Parola& x, const Parola& y) const
{
return x.repetition < y.repetition;
}
}

用可选的比较对象调用,正如 dasblinken 指出的那样,很奇怪,但有效:

std::sort(p.begin(), p.end(), Parola());

选项3:外部运算符<()

bool operator <(const Parola& x, const Parola& y)
{
x.repetition < y.repetition;
}

这与 (1) 一样,使用默认的 std::less<> 比较器,但要求外部运算符也是 Parola 类的友元,以便在声明为私有(private)数据成员时访问私有(private)数据成员。用法同(1)。

选项 4:外部仿函数

class CompareParola
{
public:
bool operator ()(const Parola& x, const Parola& y) const
{
return x.repetition < right.repetition;
}
};

并被使用:

std::sort(p.begin(), p.end(), CompareParola());

像 (3) 一样,如果被访问的成员是私有(private)的,则 CompareParola 类必须与 Parola 成为 friend :

选项 5:外部函数

bool ParolaLess(const Parola& x, const Parola& y)
{
return x.repetition < y.repetition;
}

类似于外部运算符或外部功能类,这也需要与对象类成为 friend 才能访问私有(private)成员。像这样调用:

std::sort(p.begin(), p.end(), ParolaLess);

选项 6:静态类函数

class Parola {
public:
string s;
int repetition;

static bool Less(const Parola& x, const Parola& y)  
{
return x.repetition < y.repetition;
}
};

这通常未被充分利用,并且具有访问所有对象成员变量的非常好的属性,包括私有(private)变量(显然,它是用类定义的)。您可以通过以下方式使用它:

std::sort(p.begin(), p.end(), Parola::Less)

请注意,这与 (1) 和 (2) 一样,将所有内容保留在类中。

在所有这些中,我更喜欢 (1) 的简单性,以及 (4) 的独立性,但每个人都有自己的品味。有时 (5) 或 (6) 真的派上用场了(我个人是 (6) 的粉丝)。

如果您能想到更多并让代表对其进行编辑,请根据需要进行更新。请尽量让它们至少有点用处 =P

关于c++ - 在 C++ 中对类的 vector 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12787165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com