我在Animal
中有重载运算符
// A must be comparable to be used as keys
bool operator<(const Archivo &right) const
{
return nombreArchivo < right.nombreArchivo;
}
在我的main
我打电话
std::vector<Animal*> animalesConConcha;
// add some objects
std::sort(animalesConConcha.begin(), animalesConConcha.end());
std::cout<<"\n\n\nOrdered:\n";
for(it=animalesConConcha.begin(); it!=animalesConConcha.end(); it++)
{
cout<<(*it)->nombre<<" | "<<(*it)->indice<<endl;
}
但输出仍未排序。
答案 0 :(得分:1)
因为您要存储指向Animal
的指针向量,所以您没有机会让您的班级的operator<()
工作。 sort
函数使用operator<()
作为向量中的内容类型 - 在这种情况下是指向Animal
的指针,而不是Animal
的实例。
因此,对于指针,数组基于operator<()
进行排序,如0x499602D2所说,这将导致指针数组按升序地址排序。
如果您希望以这种方式工作,请定义自定义比较器或使用vector<Animal>
代替vector<Animal*>
答案 1 :(得分:1)
您正在向量中存储指针,而不是对象。 std::sort
不会取消引用指针,但会比较实际的指针值。 (从技术上讲,这没有保证的行为,因为<
直接用在指针上。)
解决方案1:将对象直接存储在矢量中:
vector<Animal> animalesConConcha;
sort(animalesConConcha.begin(), animalesConConcha.end());
for(it=animalesConConcha.begin(); it!=animalesConConcha.end(); it++)
{
cout<< it->nombre<<" | "<< it->indice<<endl;
}
解决方案2:为std::sort
指定自定义比较仿函数:
struct Comparison
{
bool const operator()(Animal *lhs, Animal *rhs) const
{
return (*lhs) < (*rhs);
}
};
sort(animalesConConcha.begin(), animalesConConcha.end(), Comparison());
答案 2 :(得分:0)
考虑到你没有动物矢量。
在您的代码中,有一个指向动物的指针向量。
更改
vector<Animal*>
的
vector<Animal>
告诉我们现在是否有效。
答案 3 :(得分:0)
我假设你想要实现它的多态性,这就是你使用Animal*
而不是堆栈分配的Animal
对象的原因。由于您使用指针作为向量的值类型,std::sort()
使用operator<()
解析为内置重载,它只是比较指针的地址而不是自定义运算符。
方便地,std::sort()
将谓词作为可选的第三个参数。您可以传递一个可调用的实体作为比较器调用:
std::sort(animalesConConcha.begin(), animalesConConcha.end(),
[] (Animal* lhs, Animal* rhs) {
return lhs->nombreArchivo < rhs->nombreArchivo;
});
如果编译器不支持lambda表达式,则可以使用带有重载operator()
的函数或类实例。