如何按类属性对 c++ 向量数组进行排序

How can i sort c++ vector array by class property

本文关键字:数组 排序 向量 c++ 何按类 属性      更新时间:2023-10-16

我有一个元素类型的向量数组。现在如何根据每个元素的中心值与 100 的距离按升序对数组进行排序?

在这种情况下,生成的 Elements 矢量数组将导致矢量数组被排序

,如下所示...

元素排序:

Elements.push_back(Element(77));
Elements.push_back(Element(128));
Elements.push_back(Element(20));
Elements.push_back(Element(-370));
Elements.push_back(Element(-489));

法典:

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;

class Element
{
    public:
        int Center;
        Element(int center)
        {
            Center = center;
        }
};
int main(int)
{
    cout << "Start...n";
    vector<Element> Elements;
    // add test objects
    Elements.push_back(Element(20));
    Elements.push_back(Element(-370));
    Elements.push_back(Element(128));
    Elements.push_back(Element(77));
    Elements.push_back(Element(-489));
    //cout << "value of a: " << Elements.size() << endl;
    for (vector<Element>::size_type i = 0; i != Elements.size(); i++) {
        cout << "value of a: " << Elements[i].Center << endl;
    }
    return 0;
}

下面是这里的例子:

// sort using a lambda expression 
    std::sort(s.begin(), s.end(), [](int a, int b) {
        return b < a;   
    });

您提供了一个 lambda,该 lambda 提供了有关您正在排序的条件的逻辑。在您的情况下,条件将处理Center变量。 ab是向量中要比较的任意两个元素。

在您的情况下,您的将如下所示(我目前不在编译器进行测试,您的排序逻辑的细节可能与我理解的不同):

std::sort(Elements.begin(), Elements.end(), [](Element a, Element b) {
     return abs(100 - b.Center) > abs(100 - a.Center);   
});

考虑到你的示例是错误的(77 应该在 128 之前),你可能想使用这样的std::sort

std::sort(Elements.begin(), Elements.end(), [](const Element& a, const Element& b) {
     return std::abs(100 - a.Center) < std::abs(100 - b.Center);   
});

这里的问题是,如果你有:75和125,它将把75放在第一位(如果首先插入),正如James Adkison所指出的那样。

现场示例