You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用std::sort排序自定义Polygon3D类失败,求原因及解决方法

问题原因与修复方案

你的代码排序失效的核心问题出在赋值运算符operator=的实现错误,导致std::sort无法正确交换元素的值。

具体问题分析

当std::sort对vector元素进行排序时,需要通过赋值操作来交换元素位置。但你的operator=实现只是直接返回*this,完全没有完成成员变量的拷贝:

Polygon3D& Polygon3D::operator=(const Polygon3D& rhs) {
    return *this; // 没有拷贝任何数据!
}

这意味着排序过程中,元素的_averageZ值始终不会改变,vector自然保持初始插入顺序,所以你看到输出是2065而非预期的升序结果。

修复步骤

  1. 修正赋值运算符
    补充成员变量的拷贝逻辑,同时加上自赋值保护:

    Polygon3D& Polygon3D::operator=(const Polygon3D& rhs) {
        if (this != &rhs) { // 避免自赋值导致的不必要操作
            _averageZ = rhs._averageZ; // 直接访问同类型私有成员,高效简洁
        }
        return *this;
    }
    
  2. 优化拷贝构造函数(可选但推荐)
    你的拷贝构造函数虽然能工作,但可以直接访问私有成员替代调用GetAverageZ(),更高效:

    Polygon3D::Polygon3D(const Polygon3D& p) {
        _averageZ = p._averageZ;
    }
    
  3. 简化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:39:33