У меня есть vector<data> info
, где data
определяется как:
struct data{
string word;
int number;
};
Мне нужно отсортировать info
по длине строк слова. Есть ли быстрый и простой способ сделать это?
У меня есть vector<data> info
, где data
определяется как:
struct data{
string word;
int number;
};
Мне нужно отсортировать info
по длине строк слова. Есть ли быстрый и простой способ сделать это?
Используйте функцию сравнения:
bool compareByLength(const data &a, const data &b)
{
return a.word.size() < b.word.size();
}
а затем используйте std::sort
в заголовке #include <algorithm>
:
std::sort(info.begin(), info.end(), compareByLength);
Просто выполните функцию сравнения/функтор:
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());
Да: вы можете сортировать с помощью пользовательской функции сравнения:
std::sort(info.begin(), info.end(), my_custom_comparison);
my_custom_comparison
должна быть функция или класс с перегрузкой operator()
(функтор), которая принимает два объекта data
и возвращает bool
, указывающую, упорядочивается ли первое до второго (т.е. first < second
). В качестве альтернативы вы можете перегрузить operator<
для вашего типа класса data
; operator<
- это порядок по умолчанию, используемый std::sort
.
В любом случае, функция сравнения должна давать строгий слабый порядок элементов.
Как уже упоминалось, вы можете использовать функцию сравнения, но вы также можете перегрузить < оператор и функтор 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());
Edit
Как отметил Джеймс Макнеллис, sort
фактически не использует функтора less<T>
по умолчанию. Однако остальная часть утверждения, что функтор less<T>
будет работать, по-прежнему правильна, а это означает, что если вы хотите поместить struct data
в std::map
или std::set
, это все равно будет работать, но другие ответы которые обеспечивают функцию сравнения, потребуется дополнительный код для работы с ним.