我有一个vector<data> info
,其中data
定义为:
struct data{
string word;
int number;
};
我需要按字符串的长度对info
进行排序。有一种快速简单的方法吗?
答案 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::map
或std::set
这仍然有效,但提供比较功能的其他答案需要额外的代码才能使用。