C ++如何使用运算符&lt; </class>对vector <class * =“”>进行排序

时间:2011-04-12 13:24:56

标签: 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()) 

为什么它不排序?

但如果我们有

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

vector<c1> vec = { ... }

它会被排序!

7 个答案:

答案 0 :(得分: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 );

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

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 & ),同样为其他类定义。

通常,最佳做法是完全避免指针,包括指针数组。

答案 1 :(得分:3)

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

指针是内置类型,您不能覆盖所有操作数都是内置类型的运算符。

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

答案 2 :(得分:1)

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

进行比较

答案 3 :(得分:1)

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

bool compare_c1 (c1* x, c1* y)
{
  return *x < y;
}

std::sort(v.begin(), v.end(), compare_c1);

或者,如果您使用的是GCC&gt; = 4.5或Visual Studio 2010(我不确定英特尔编译器),您可以使用lambdas(它们是C ++ 0x标准的一部分):

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

答案 4 :(得分:0)

添加外部运营商&lt;并保持原来的一个:

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

现在sort将对矢量起作用。

答案 5 :(得分:0)

phimuemue的答案总结了一下,我只想补充一点,作为一种解决方法,你可以创建一个只包含一个成员的包装类 - 一个指向c1的指针,然后重载它的运算符&lt;。然后你可以对该类的对象矢量进行排序。

答案 6 :(得分:0)

在您的示例中,vector<c1*>已排序。只是不要 您似乎想要的标准:默认情况下,sort使用 std::less<T>作为排序条件,std::less<ci*> 比较指针(这是你所期望的)。如果你 不想要默认条件,那么你必须传递第三个 sort的参数,一个定义所需顺序的谓词。

当然,您的会员operator<(c1*)只会被呼叫 将c1ci*进行比较时(仅当c1是一个时) 右值)。这些操作员非常非常罕见 - 通常都是 <运算符的边应该采用相同的类型(并且应该是 const,因为<运算符修改了值 它比较的对象会令人惊讶,至少可以这么说。

相关问题