gpt4 book ai didi

c++ - 如何对包含类对象的 "vector"进行排序?为什么我错了?

转载 作者:搜寻专家 更新时间:2023-10-31 00:20:57 25 4
gpt4 key购买 nike

今天我写了一些关于使用 std::sort() 操作包含类对象的“vector ”类型的代码,但是我在编码中发现了很多问题,请帮助我找到解决方案:

#include <vector>
#include <algorithm>

class Obj{
private:
int m_;
public:
Obj():m_(0) {}
int act() { return m_; }
bool operator<(Obj obj) {
return this->act() < obj.act();
}
};
bool cmp(Obj a, Obj b)
{
return a.act() < b.act();
}
bool cmpA(const Obj& a, const Obj& b)
{
return a.act() < b.act(); // @1 but wrong!
}
int foo()
{
std::vector<Obj> vobj;
// ...
std::sort(vobj.begin(),vobj.end(),cmp); // @2 well, it's ok.
std::sort(vobj.begin(),vobj.end()); // @3 but wrong!
return 0;
}

@1:为什么param的类型必须是'Obj'而不是'const Obj&'?但是当'Obj'是结构类型时,它不会报错,为什么?

@3:我重载了操作符'<',但是这里编译时不能通过。我错过了什么吗?请帮助我,谢谢!

最佳答案

使用 std::sort 时您可以像您一样选择传递比较器。如果你不这样做,std::sort将使用 std::less作为比较器,std::less默认使用 operator< .

您可以使用您的 cmpA仿函数,但是你只能访问传递对象的 const 成员函数 - 你在 cmpA 中有一个对它们的 const 引用.

class Obj{
private:
int m_;
public:
Obj():m_(0) {}
int act() const { return m_; } // const member function, can be called on const objects or references
};

bool operator<(Obj const & L, Obj const & R) { // The operator takes const references - it can compare const objects
return L.act() < R.act();
}

使用此类和运算符,您可以在不传递比较器的情况下调用 std::sort。

关于c++ - 如何对包含类对象的 "vector"进行排序?为什么我错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5342550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com