C++如何使用operator <对vector <class*>进行排序

igo*_*gor 2 c++ sorting vector

我有

 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()) 
Run Code Online (Sandbox Code Playgroud)

为什么它有点排序?

但如果我们有

 bool operator < (c1 w)
    {
        return number < w.number;
    }
Run Code Online (Sandbox Code Playgroud)

vector<c1> vec = { ... }
Run Code Online (Sandbox Code Playgroud)

它会被排序!

Pot*_*ter 7

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

bool c1_ptr_less( c1 const *lhs, c1 const *rhs ) {
    return lhs->something < rhs->something;
}

std::sort( vec.begin(), vec.end(), & c1_ptr_less );
Run Code Online (Sandbox Code Playgroud)

我建议使用通用仿函数来处理所有指针数组

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() );
Run Code Online (Sandbox Code Playgroud)

有了这个,定义通常c1::operator< ( const c1 & )和其他类别.

通常,最佳实践是完全避免指针,包括指针数组.