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

如何对存储派生类实例指针的std::vector按worldY升序排序?

2D RPG实体按worldY升序排序的正确实现

直接调用std::sort(entities.begin(), entities.end())无效的原因是:默认排序逻辑比较的是指针的内存地址,而非指针指向对象的worldY属性。要实现按worldY升序排序,需要自定义比较规则,以下是几种可行方案:

方案1:使用Lambda表达式(推荐,简洁直观)

直接在std::sort中传入自定义比较逻辑,同时加入空指针检查避免崩溃:

#include <algorithm>

// 排序调用
std::sort(entities.begin(), entities.end(), [](Entity* a, Entity* b) {
    // 处理空指针:可根据需求将空指针放在容器末尾/开头
    if (!a || !b) {
        return false;
    }
    // 按worldY升序排序
    return a->worldY < b->worldY;
});

方案2:独立比较函数

如果需要复用比较逻辑,可以单独定义比较函数:

#include <algorithm>

// 定义比较函数
bool compareByWorldY(Entity* a, Entity* b) {
    if (!a || !b) {
        return false;
    }
    return a->worldY < b->worldY;
}

// 排序调用
std::sort(entities.begin(), entities.end(), compareByWorldY);

方案3:重载Entity类的operator<(适用于需多次比较对象本身的场景)

若需要频繁比较Entity对象而非指针,可以在基类中重载<运算符,再通过解引用指针实现排序:

class Entity {
public:
    float worldY;
    // 其他成员变量/方法...

    // 重载小于运算符
    bool operator<(const Entity& other) const {
        return worldY < other.worldY;
    }
};

// 排序调用
std::sort(entities.begin(), entities.end(), [](Entity* a, Entity* b) {
    if (!a || !b) {
        return false;
    }
    return *a < *b;
});

注意事项

  • 必须加入空指针检查:避免容器中存在空指针时访问worldY导致程序崩溃。
  • 确保worldY是Entity基类的公共成员(或通过公共getter方法访问):派生类(Player/NPC/OBJ_o)需正确继承该属性,否则无法通过基类指针访问。

内容的提问来源于stack exchange,提问作者malloy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:35:00