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

C++中类实例指针vector排序异常问题求助

问题根源

你重载的operator<是针对C类对象的,但你的容器是std::vector<C*>(存储对象指针)。当调用std::sort时,默认行为是比较指针的内存地址,完全不会触发你为C对象定义的比较运算符——这就是为什么输出顺序随机,因为new分配的内存地址是不确定的。

解决方法

方法1:给std::sort传递自定义比较器(最灵活,推荐)

直接在std::sort的第三个参数里传入lambda表达式,明确告诉排序逻辑如何比较两个指针指向的对象:

// 修改sort调用部分
std::sort(v.begin(), v.end(), [](const C* a, const C* b) {
    // 沿用你原来的降序逻辑:name大的排在前面
    return a->getName() > b->getName();
});

另外注意:你的getName()成员函数应该声明为const,因为我们在const C*指针上调用它,避免编译警告:

std::string getName() const {
    return name;
}

方法2:改用存储对象而非指针(如果场景允许)

如果不需要动态分配对象,直接把容器改成std::vector<C>,这样std::sort会自动使用你重载的operator<:

// 修改main函数里的容器定义和对象添加逻辑
std::vector<C> v;
v.emplace_back("Tom");
v.emplace_back("Jane");
v.emplace_back("Dick");
v.emplace_back("Harry");

std::sort(v.begin(), v.end()); // 直接使用你重载的operator<

额外说明

你当前重载的operator<实现的是降序排序(return name > x.name),如果需要升序排列,把逻辑改成return name < x.name即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:05:21