我如何按类属性对C++向量数组进行排序[重复]

Posted

技术标签:

【中文标题】我如何按类属性对C++向量数组进行排序[重复]【英文标题】:How can i sort c++ vector array by class property [duplicate] 【发布时间】:2016-02-17 15:49:56 【问题描述】:

我有一个元素类型的向量数组。现在如何根据每个元素的中心值与 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;

【问题讨论】:

cplusplus.com/reference/algorithm/sort std::sort 与执行所需比较的 lambda 表达式一起使用。 排序最接近 100? 128和100相差28,77是23。为什么128在77之前。 不相关但注意并使用initializer lists(即Element(int center) : Center(center) @FlorisVelleman 我的错误,但我猜你明白了。 【参考方案1】:

这是来自here的示例:

// 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);   
);

【讨论】:

这是什么意思? (目前不在编译器中): 这显示了如何进行标准升序排序,但不排序“基于每个元素的中心值与 100 的距离?”按照 OP 的要求。 a.Center 不适用于 int 类型。 @JamesAdkison 你说 a.Center 不是 int 是什么意思? 在您的代码中,a 的类型为 int,因此 a.Center 无效(即 [](int a, int b) ... )。我很确定您的意思是 Element 而不是 int 代表 ab【参考方案2】:

考虑到您的示例是错误的(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 所指出的那样。

Live example

【讨论】:

以上是关于我如何按类属性对C++向量数组进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中对向量进行分组排序

在 C++ 中,是不是可以针对这些对象的任何属性轻松地对对象类型指针的向量进行排序?

对向量进行冒泡排序的 C++ 长度错误

C++ 对向量或链表进行排序

C++:如何检测向量中的重复项并打印一份?

如何在 C++ 中对向量组元素进行排序?