对矢量不起作用

时间:2014-07-11 15:11:27

标签: c++ sorting object vector stl

我在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;
}

但输出仍未排序。

4 个答案:

答案 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()的函数或类实例。