排序结构的矢量

cal*_*pto 52 c++ sorting vector

我有一个vector<data> info地方data被定义为:

struct data{
    string word;
    int number;
};
Run Code Online (Sandbox Code Playgroud)

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

Oli*_*rth 74

使用比较功能:

bool compareByLength(const data &a, const data &b)
{
    return a.word.size() < b.word.size();
}
Run Code Online (Sandbox Code Playgroud)

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

std::sort(info.begin(), info.end(), compareByLength);
Run Code Online (Sandbox Code Playgroud)

  • 如果我想根据提交的字符串按字典顺序对向量进行排序怎么办?(如果重要的话我正在使用 C++11)。除了定义比较函数 /use lambda 并使用 std::string 的积分运算符&lt; 之外,还有其他方法可以实现它吗?下面是我使用 lambda 的解决方案: sort(info.begin(),info.end(), [](const data&amp; d1, const data&amp; d2) { return (d1.word.compare(d2.word) &lt; 0); } ); (2认同)

Mur*_*los 35

只需做一个比较函数/仿函数:

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);
Run Code Online (Sandbox Code Playgroud)

或者bool operator<(const data& a) constdata课堂上提供:

struct data {
    string word;
    int number;

    bool operator<(const data& a) const
    {
        return word.size() < a.word.size();
    }
};
Run Code Online (Sandbox Code Playgroud)

弗雷德说:或非成员

struct data {
    string word;
    int number;
};

bool operator<(const data& a, const data& b)
{
    return a.word.size() < b.word.size();
}
Run Code Online (Sandbox Code Playgroud)

并致电std::sort():

std::sort(info.begin(), info.end());
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,你不应该使用运算符重载来包装不直接的行为.在这种情况下,如果它的字符串成员较短,那么说'data a`是"小于"`data b`并没有任何意义,所以我不会用`operator <`来表达这个想法. (3认同)
  • 在这种情况下,我同意你的看法,这就是为什么我先写下"功能方式",然后我解释了学习目的的其他方法. (2认同)

Jam*_*lis 6

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

std::sort(info.begin(), info.end(), my_custom_comparison);
Run Code Online (Sandbox Code Playgroud)

my_custom_comparison需要是一个函数或一个带有operator()重载的函数(一个函子),它接受两个data对象并返回一个bool指示第一个是否在第二个之前排序的信息(即,first < second).或者,您可以operator<为类类型重载data; operator<是使用的默认顺序std::sort.

无论哪种方式,比较函数必须产生元素的严格弱排序.