3

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

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 迭代器一次只访问向量中的一个结构?

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

4

2 回答 2

18

您可以将 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 定义运算符 <,但如果您定义它,最好定义其余部分。

于 2013-09-12T09:09:15.610 回答
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,你可以在某处声明和定义比较器函数,然后你甚至不需要将它传递给 sort。这也适用于 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

我推荐第二种声明 a 的方式,operator<因为为类定义比较器函数更有意义;lambda 方式更像是一种写入和丢弃类型的便利功能。

于 2013-09-12T09:08:57.670 回答