我如何按类属性对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
变量。 a
和 b
是向量中要比较的任意两个元素。
在你的情况下,你的看起来像这样(我现在不在编译器测试,你的排序逻辑的细节可能与我理解的不同):
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
代表 a
和 b
。【参考方案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++向量数组进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章