排序结构的矢量

时间:2011-02-03 22:49:49

标签: c++ sorting vector

我有一个vector<data> info,其中data定义为:

struct data{
    string word;
    int number;
};

我需要按字符串的长度对info进行排序。有一种快速简单的方法吗?

4 个答案:

答案 0 :(得分:74)

使用比较功能:

bool compareByLength(const data &a, const data &b)
{
    return a.word.size() < b.word.size();
}

然后在标题#include <algorithm>中使用std::sort

std::sort(info.begin(), info.end(), compareByLength);

答案 1 :(得分:32)

只需制作比较函数/仿函数:

bool my_cmp(const data& a, const data& b)
{
    // smallest comes first
    return a.word.size() < b.word.size();
}

std::sort(info.begin(), info.end(), my_cmp);

或者在bool operator<(const data& a) const课程中提供data

struct data {
    string word;
    int number;

    bool operator<(const data& a) const
    {
        return word.size() < a.word.size();
    }
};
弗雷德说:

或非成员:

struct data {
    string word;
    int number;
};

bool operator<(const data& a, const data& b)
{
    return a.word.size() < b.word.size();
}

然后致电std::sort()

std::sort(info.begin(), info.end());

答案 2 :(得分:6)

是:您可以使用自定义比较功能进行排序:

std::sort(info.begin(), info.end(), my_custom_comparison);

my_custom_comparison需要是一个函数或具有operator()重载(一个仿函数)的类,它需要两个data个对象并返回一个bool,表示第一个是在第二个之前排序(即first < second)。或者,您可以为类类型operator<重载data; operator<std::sort使用的默认排序。

无论哪种方式,比较函数都必须产生strict weak ordering个元素。

答案 3 :(得分:1)

正如其他人所提到的,你可以使用比较功能,但你也可以重载&lt;运算符和默认的less<T>仿函数也可以正常工作:

struct data {
    string word;
    int number;
    bool operator < (const data& rhs) const {
        return word.size() < rhs.word.size();
    }
};

然后就是:

std::sort(info.begin(), info.end());

修改

正如James McNellis所指出的那样,sort默认情况下并不实际使用less<T>仿函数。但是,less<T>仿函数的其余部分仍然正常,这意味着如果您想将struct data放入std::mapstd::set这仍然有效,但提供比较功能的其他答案需要额外的代码才能使用。