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
相关产品推荐
相关产品推荐

