我有一个数据结构,例如:
struct Data
{
string firstname;
string lastname:
string age;
}
我已将每个结构放在一个向量中(VectorOfData)。是否可以循环遍历此向量并按向下年龄对向量中的每个结构进行排序?使用类似的东西:
for(std::vector<Data>::const_iterator it = VectorOfData.begin(); it != VectorOfData.end(); ++it)
{
//sorting by age here?
}
我假设它不会那么简单,因为it迭代器一次只访问向量中的一个结构?
我意识到我甚至可以在将结构放入向量之前进行排序,但我的问题并非如此简单。这是我能解释它的最简单方法。任何建议都将非常感谢,谢谢
答案 0 :(得分:15)
您可以将std :: sort与自定义比较函数一起使用:
bool is_younger(const Data& x, const Data& y) { return x.age < y.age; }
分选
std::sort(VectorOfData.begin(), VectorOfData.end(), is_younger);
或者,您可以定义自定义仿函数(注意:这实际上是首选,因为它增加了内联的可能性,请阅读:更快排序)
struct is_younger_functor
{
bool operator()(const Data& x, const Data& y) const
{
return x.age < y.age;
}
};
分选
std::sort(VectorOfData.begin(), VectorOfData.end(), is_younger_functor());
如果要为Data
定义严格的排序关系,则应考虑将其转换为常规类型(定义运算符&lt;,&lt; =,==,!=,&gt;,&gt; = )。
在这种情况下,您不需要定义这个is_younger仿函数,只需用迭代器调用std :: sort。
编辑:严格来说,你只需要定义运算符&lt;对于std :: sort,但如果你定义它,最好定义其余部分。
答案 1 :(得分:7)
您可以使用std::sort。它在算法中定义为
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
其中comp是
类型的比较器函数bool cmp(const Type1 &a, const Type2 &b);
您可以根据自己的需要进行定义。
如果您使用的是C ++ 11,则可以传入lambda函数。例如
std::sort(VectorOfData.begin(), VectorOfData.end(), [](const Data &a, const Data &b)
{
return (a.age.length() < b.age.length());
});
如果你不能使用C ++ 11,你可以在某处声明和定义比较器功能,然后你甚至不需要将它传递给排序。这也适用于C ++ 11。
bool operator<(const Data& a, const Data& b)
{
return (a.age.length() < b.age.length());
}
std::sort(VectorOfData.begin(), VectorOfData.end()); // sort's variant without comparator
我建议使用第二种声明operator<
的方法,因为为类定义比较器函数更有意义; lambda方式更像是一种写入和丢弃的便利函数。