【问题标题】:sort a vector not working [duplicate]对不起作用的向量进行排序[重复]
【发布时间】:2014-09-02 06:31:02
【问题描述】:

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

但是输出仍然是未排序的。

【问题讨论】:

  • 确保在用特定语言提问时添加语言标签(我已经为您添加了 C++)。
  • 那些是 Animal*s,而不是 Animal 对象。因此,std::sort() 按地址对它们进行排序。

标签: c++ sorting object vector stl


【解决方案1】:

因为您正在存储指向Animal 的指针向量,所以您没有机会让您的班级的operator&lt;() 工作。 sort 函数将 operator&lt;() 用于向量中的类型 - 在本例中是指向 Animal 的指针,而不是 Animal 的实例。

因此,数组根据 pointersoperator&lt;() 进行排序,正如 0x499602D2 所说,这将导致指针数组按升序排列。

如果您希望它以这种方式工作,请定义自定义比较器或使用 vector&lt;Animal&gt; 而不是 vector&lt;Animal*&gt;

【讨论】:

    【解决方案2】:

    请注意,您没有包含 Animals 的向量。

    在您的代码中,有一个指向 Animals 的指针向量。

    改变

    vector<Animal*>
    

    vector<Animal>
    

    并告诉我们现在是否工作。

    【讨论】:

    • 哼...再试一次? :)
    • 您需要在vector 之前添加4 个空格,而不是使用&gt; ,以便将其格式化为代码。
    • 感谢您的帮助和编辑我的答案:-)
    【解决方案3】:

    您将指针存储在向量中,而不是对象中。 std::sort 不会取消引用指针,而是比较实际的指针值。 (从技术上讲,这并不能保证行为,因为 &lt; 直接在指针上使用。)

    方案一:将对象直接存入vector中:

    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());
    

    【讨论】:

      【解决方案4】:

      我假设它是您想要实现的多态性,这就是您使用 Animal*s 而不是堆栈分配的 Animal 对象的原因。由于您使用指针作为向量的值类型,std::sort()s 使用 operator&lt;() 解析为内置重载,它将简单地比较指针的地址而不是您的自定义运算符。

      方便地,std::sort() 将谓词作为可选的第三个参数。您可以传递一个可调用实体作为比较器调用:

      std::sort(animalesConConcha.begin(), animalesConConcha.end(),
      [] (Animal* lhs, Animal* rhs) {
          return lhs->nombreArchivo < rhs->nombreArchivo;
      });
      

      如果您的编译器不支持 lambda 表达式,您可以改用带有重载 operator() 的函数或类实例。

      【讨论】:

        猜你喜欢
        • 2013-10-15
        • 2013-08-09
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-08
        • 1970-01-01
        相关资源
        最近更新 更多