使用std::sort排序自定义Polygon3D类失败,求原因及解决方法
问题原因与修复方案
你的代码排序失效的核心问题出在赋值运算符operator=的实现错误,导致std::sort无法正确交换元素的值。
具体问题分析
当std::sort对vector元素进行排序时,需要通过赋值操作来交换元素位置。但你的operator=实现只是直接返回*this,完全没有完成成员变量的拷贝:
Polygon3D& Polygon3D::operator=(const Polygon3D& rhs) { return *this; // 没有拷贝任何数据! }
这意味着排序过程中,元素的_averageZ值始终不会改变,vector自然保持初始插入顺序,所以你看到输出是2065而非预期的升序结果。
修复步骤
修正赋值运算符
补充成员变量的拷贝逻辑,同时加上自赋值保护:Polygon3D& Polygon3D::operator=(const Polygon3D& rhs) { if (this != &rhs) { // 避免自赋值导致的不必要操作 _averageZ = rhs._averageZ; // 直接访问同类型私有成员,高效简洁 } return *this; }优化拷贝构造函数(可选但推荐)
你的拷贝构造函数虽然能工作,但可以直接访问私有成员替代调用GetAverageZ(),更高效:Polygon3D::Polygon3D(const Polygon3D& p) { _averageZ = p._averageZ; }简化
operator<返回值(可选)
返回const bool是不必要的,改为常规的bool类型更符合C++编码习惯:// 头文件中声明 bool operator< (const Polygon3D& rhs) const; // 实现文件中定义 bool Polygon3D::operator<(const Polygon3D& rhs) const { return _averageZ < rhs._averageZ; }
修复后效果
修正后运行代码,输出会变为0256,符合升序排序的预期。
内容的提问来源于stack exchange,提问作者ShayP
相关产品推荐
相关产品推荐

