C++如何使用运算符<对向量<类*>进行排序

C++ how to sort vector<class *> with operator <

本文关键字:lt gt 排序 何使用 运算符 C++ 向量      更新时间:2023-10-16

我有

 class c1{
public:
    int number;
    c1()
    {
        number=rand()%10;
    }
    bool operator < (c1 *w)
    {
        return number < w->number;
    }

};
vector<c1*> vec = { ... }
sort(vec.begin(),vec.end()) 

为什么不排序?

但是如果我们有

 bool operator < (c1 w)
    {
        return number < w.number;
    }

vector<c1> vec = { ... }

最直接的方法是定义一个函数

bool c1_ptr_less( c1 const *lhs, c1 const *rhs ) {
    return lhs->something < rhs->something;
}
std::sort( vec.begin(), vec.end(), & c1_ptr_less );
我建议使用泛型函子来处理所有指针数组

struct pointer_less {
    template< typename T >
    bool operator()( T const *lhs, T const *rhs ) const
        { return * lhs < * rhs; }
};
std::sort( vec.begin(), vec.end(), pointer_less() );
有了这个,定义通常的c1::operator< ( const c1 & ),同样地为其他类定义。

一般来说,最佳实践是完全避免指针,包括指针数组。

要回答你的标题问题,你不能。

指针是内置类型,不能重写所有操作数都是内置类型的操作符。

幸运的是,std::sort有一个重载,允许您指定一个比较函数(或函子),因此不使用operator<

bool operator < (c1 *w)比较c1c1 * -您的排序比较c1 *c1 *

您需要传递一个比较函数给std::sort:

bool compare_c1 (c1* x, c1* y)
{
  return *x < y;
}
std::sort(v.begin(), v.end(), compare_c1);

或者如果你正在使用GCC>= 4.5或Visual Studio 2010(我不确定是否有Intel编译器),你可以使用lambdas(它们是c++ 0x标准的一部分):

std::sort(v.begin(), v.end(), [] (c1* x, c1* y) { return *x < y; });

添加外部操作符<并保留原来的:

bool operator<(c1* a, c1* b) { return *a < *b; } 

现在可以对向量进行排序了

phimuemue的回答总结了这一点,我只补充一点,作为一种解决方法,您可以创建一个只包含一个成员(指向c1的指针)的包装器类,然后重载它的操作符<然后你可以对这个类的对象的向量进行排序

在您的示例中,对vector<c1*>进行排序。只是不能。您想要的标准:默认情况下,sort使用std::less<T>为排序标准,std::less<ci*>为排序标准比较指针(这是您所期望的)。如果你不想要默认的标准,那么就必须通过第三个参数sort,定义您想要的排序的谓词。

当然,你的成员operator<(c1*)只会被调用当比较c1ci*时(仅当c1是右值)。这样的运营商非常、非常罕见——通常两者兼而有之<操作符的两边应该采用相同的类型(并且应该是)const,因为<操作符可以修改它比较的对象至少会令人惊讶)。