在STL中,list是一个数据结构,可以按值自动对数字进行排序。如果元素不是数字而是类的实例,并且我希望容器根据类成员的值自动对元素进行排序,那么我应该使用哪种容器?例如
class Rect{
double height;
double width;
double area;
};
我希望容器按矩形的area
自动排序。
答案 0 :(得分:2)
如果要自动排序,则必须执行所谓的
1)Operator Overloading of less than < operator
对于您的任务,要自动排序,在您编写比较函数或重载&lt;运算符,您可以使用
STL set或priority queue。这两个数据结构被定义为基于比较函数自动对元素进行排序。但是这里要注意的是,你不能插入重复的元素 设置,即如果两个矩形的区域相同,那么这些rects中的第一个将保存在集合中。第二个不能插入。
答案 1 :(得分:2)
您有std::multiset
自动订购容器:
std::multiset<Rect, LessArea> rects;
LessArea
struct LessArea
{
bool operator ()(const Rect& lhs, const Rect& rhs) const
{
return lhs.area < rhs.area;
}
};
答案 2 :(得分:1)
stl::priority_queue
就是你想要的。只需使用Rect
在less<Rect>
上定义排序,或为stl::priority_queue
专门定义Rect
。
答案 3 :(得分:1)
使用std :: set的程序如下所示。
class Rect{
double height;
double width;
double area;
public:
bool operator<( const Rect& rhs ) const
{ return area < rhs.area; }
};
你需要定义“&lt;”运营商进行比较。 请注意:std :: set不允许同一个对象的多个副本。你可以在set里面只包含唯一的元素。
答案 4 :(得分:1)
我不介意使用矢量,特别是如果您希望能够存储重复元素。通过使用简单的lambda函数,我们可以通过我们想要的任何Rect成员对对象进行排序。在这个例子中,我选择按区域对Rect对象进行排序。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Rect {
Rect(double height, double width, double area) {
_height = height;
_width = width;
_area = area;
}
double area() const {
return _area;
}
// sorts Rect objects by ascending order of area
static void sort_by_area(vector<Rect> &shapes) {
sort(shapes.begin(), shapes.end(), [](const Rect &first, const Rec &second)
{ return first.area() < second.area); });
}
private:
double _height;
double _width;
double _area;
};
int main() {
vector<Rect> r;
r.push_back(Rect(0,0,3));
r.push_back(Rect(0,0,2));
r.push_back(Rect(0,0,4));
for(auto &obj : r) {
//prints 3 2 4
cout << obj.area() << endl;
}
Rect::sort_by_area(r);
for(auto &obj : r) {
//prints 2 3 4
cout << obj.area() << endl;
}
return 0;
}