std :: sort不会移动向量的元素

时间:2017-12-29 23:38:46

标签: c++ copy operator-overloading

目标很简单,我有一个Rectangle类,包含宽度,高度和面积属性。我为<运算符设置了运算符重载,因为这是std::sort用于它的比较。

根据我到目前为止在网上找到的内容,似乎这个问题通常源于复制操作符或类的构造函数中的错误。

这是Rectangle类的复制构造函数:

Rectangle::Rectangle(const Rectangle & other)
{
     m_width = other.m_width;
     m_height = other.m_height;
     m_area = other.m_area;
 }

这是我的复制操作员:

 Rectangle & Rectangle::operator=(const Rectangle & rhs)
 {
     if (this != &rhs)
     {
         m_width = rhs.m_width;
         m_height = rhs.m_height;
     }
     return *this;
}

以下是<运算符:

bool Rectangle::operator<(const Rectangle & rhs)
{
    return (m_area > rhs.m_area);
}

最后,这是我如何调用sort方法,以防万一:

// rects is a vector<Rectangle> with several rectangles in it
std::sort(rects.begin(), rects.end());

我认为我正在做的一切正确,但任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

您的比较仅使用m_area - 正如@Galik指出的那样,您在“复制运算符”中设置 。因此,对于所有赋值构造的实例,它没有被初始化和“相同” - 因此没有排序。

根据您创建示例数据的方式,他们都有未初始化 m_area

修复如下:

 Rectangle & Rectangle::operator=(const Rectangle & rhs)
 {
     if (this != &rhs)
     {
         m_width = rhs.m_width;
         m_height = rhs.m_height;
         m_area = rhs.m_area;    // FIX 
     }
     return *this;
}

@Juanchopanza指出使用自动生成的实现可以自己正确处理,所以如果没有压力的情况导致你自己实现这些,请删除它们。