C ++从排序的对象数组创建排序数组的最佳方法

时间:2016-01-27 03:30:15

标签: c++ arrays sorting c++11 vector

有没有更好的方法从C ++中自定义(即用户定义)对象的排序数组创建成员变量的排序数组?

示例 -

class People{
public:
   //can have multiple parameters. What are the options in either case?
   unsigned int birth_year;
};

假设我们有一个std::vector<People>数组,我们希望按出生年份排序std::vector<unsigned int>

我们可以使用多种方法之一根据此链接中提到的birth_year对自定义对象进行排序 - https://github.com/vim-scripts/Solarized

现在,如果我们需要获取已排序的出生年份向量,我们将不得不遍历已排序的People向量并将其推送到unsigned int的新向量。

有没有更快的方法(使用内存偏移等)?或者在C ++ 11中是否有一个我们可以利用它的功能?

3 个答案:

答案 0 :(得分:2)

您的问题相当不明确。所以这里有一些假设和可能的解决方案

您的矢量已按出生日期排序

在这种情况下,如果你真的想要快,只需使用reinterpret_cast。这是邪恶的,但如果你的Person - 类真的只是由那个成员组成,那么它肯定是最快的。

您的Person班级的成员数不仅仅是birth_date

将变换与lambda一起使用。

std::vector<unsigned int> vec2;
vec2.reserve(vec1.size());
transform(vec1.begin(), vec1.end(), 
          back_inserter(vec2), 
          [](const Person& p) { return p.birth_date; });

您只想阅读新的载体

在这种情况下,您可以考虑使用视图(而不是矢量),例如参见https://github.com/ericniebler/range-v3

答案 1 :(得分:1)

首先将值分成预先分配的数组是好的,这样它们对于std::sort的重排都会很好并且连续:

std::vector<unsigned> vec2;
vec2.reserve(vec1.size());
for (const auto& v : vec1) { vec2.push_back(v.birth_year); }
std::sort(vec2.begin(), vec2.end());

std::vector::reserve

答案 2 :(得分:0)

到目前为止发布的答案创建了一个新的向量,将birth_year变量的值复制到新的向量中,然后对新向量进行排序。

IMO,最好先按Peoplebirth_year的向量进行排序,然后将birth_year值从已排序的std::vector<People>复制到新{ {1}}。这将具有相同的整体性能,但会将People的矢量排序,这在某些情况下可能是有益的。您可以通过在Person类中重载std::vector<unsigned int>或通过提供自定义比较函数来执行此操作,请参阅std::sort。这是一个例子:

operator<

这是一个现场演示:Coliru demo