我有
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 = { ... }
它会被排序!
答案 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)
将c1
与c1 *
进行比较 - 您的排序将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*)
只会被呼叫
将c1
与ci*
进行比较时(仅当c1
是一个时)
右值)。这些操作员非常非常罕见 - 通常都是
<
运算符的边应该采用相同的类型(并且应该是
const
,因为<
运算符修改了值
它比较的对象会令人惊讶,至少可以这么说。