按结构内的变量对结构向量进行排序

Sort vector of structs by a variable within the struct?

本文关键字:结构 排序 向量 变量      更新时间:2023-10-16

>我有一个数据结构,例如:

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?
}

我假设它不会那么简单,因为它迭代器一次只访问向量中的一个结构?

意识到我甚至可以在将结构放入向量之前进行排序,但我的问题并不那么简单。这只是我能解释的最简单的方法。任何建议将不胜感激,谢谢

您可以将 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 定义严格的排序关系,应考虑将其转换为常规类型(定义运算符 <, <=, ==, !=,>,>=)。

在这种情况下,您将不需要定义此is_younger函子,并且可以使用迭代器调用 std::sort。

编辑:严格来说,您只需要为 std::sort 定义运算符<,但如果您定义它,最好定义其余运算符。

您可以使用 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 方式更像是一种写和扔掉类型的方便函数。