如何在C ++中对包含vector <float>类型的类进行排序?

时间:2016-07-19 08:07:19

标签: c++ sorting vector

我想对包含矢量类型的类进行排序。

例如,

class Line
{
public;
vector<float> Angle;
vector<float> Length;
}

角度和长度是线段的角度和长度。

Line LineSegment;
LineSegment.Angle.push_back(10.0);   LineSegment.Length.push_back(100.0);
LineSegment.Angle.push_back(20.0);   LineSegment.Length.push_back(50.0);
LineSegment.Angle.push_back(30.0);   LineSegment.Length.push_back(10.0);

第一个线段的角度为10度,长度为100个像素。 第二:20度,50像素,第三:30度,10像素。

对于这个例子,我想按长度排序,这样 结果应该有原始的反向索引。

我该怎么做?我搜索了几种排序算法,但是它们解决了向量或类的排序,或者包含类类型的向量。

2 个答案:

答案 0 :(得分:3)

将线段表示为对象可能更合乎逻辑,例如:

struct LineSegment {
    float Angle;
    float Length;

    LineSegment(float angle, float len) : Angle(angle), Length(len) { }
};

将一组线段(称为“线”)作为LineSegment

的向量
std::vector<LineSegment> line;
line.emplace_back(10.0, 100.0)
line.emplace_back(20.0, 50.0);
line.emplace_back(30.0, 10.0);

这对“线段”进行分组,在排序时不应拆分,如:

Angle1 Length1    Angle2 Length2    Angle3 Length3

答案中的代码如下:

Angle1 Angle2 Angle3    Length1 Length2 Length3

然后可以使用比较line个实例的比较器函数将LineSegment整体排序:

std::sort(line.begin(), line.end(), [](const LineSegment& a, const LineSegment& b) { return a.Angle < b.Angle; })
// Sorts by ascending angle

答案 1 :(得分:1)

如果选择矢量背后没有理由,可以使用常规地图:

class Line {
public:
    std::map<float, float> segments;
};

Line lineSegment;
lineSegment.segments.emplace(100.0, 10.0);
lineSegment.segments.emplace(50.0,  20.0);
lineSegment.segments.emplace(10.0,  30.0);
for (auto const& seg : lineSegment.segments) {
    std::cout << "Segment of length: " << seg.first << " and angle: " << seg.second << std::endl;
}

这将输出:

  

长度段:10和角度:30
  长度段:50和角度:20
  长度段:100和角度:10