C++如何使用运算符<对向量<类*>进行排序
C++ how to sort vector<class *> with operator <
我有
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)
比较c1
和c1 *
-您的排序比较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*)
只会被调用当比较c1
和ci*
时(仅当c1
是右值)。这样的运营商非常、非常罕见——通常两者兼而有之<
操作符的两边应该采用相同的类型(并且应该是)const
,因为<
操作符可以修改它比较的对象至少会令人惊讶)。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中