【问题标题】:How can i sort c++ vector array by class property [duplicate]我如何按类属性对C++向量数组进行排序[重复]
【发布时间】: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;
}

【问题讨论】:

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

标签: c++ arrays sorting vector


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-10-08
    • 2012-10-06
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    相关资源
    最近更新 更多