Подтвердить что ты не робот

Сортировка вектора структур

У меня есть vector<data> info, где data определяется как:

struct data{
    string word;
    int number;
};

Мне нужно отсортировать info по длине строк слова. Есть ли быстрый и простой способ сделать это?

4b9b3361

Ответ 1

Используйте функцию сравнения:

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);

Ответ 2

Просто выполните функцию сравнения/функтор:

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());

Ответ 3

Да: вы можете сортировать с помощью пользовательской функции сравнения:

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

my_custom_comparison должна быть функция или класс с перегрузкой operator() (функтор), которая принимает два объекта data и возвращает bool, указывающую, упорядочивается ли первое до второго (т.е. first < second). В качестве альтернативы вы можете перегрузить operator< для вашего типа класса data; operator< - это порядок по умолчанию, используемый std::sort.

В любом случае, функция сравнения должна давать строгий слабый порядок элементов.

Ответ 4

Как уже упоминалось, вы можете использовать функцию сравнения, но вы также можете перегрузить < оператор и функтор 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, это все равно будет работать, но другие ответы которые обеспечивают функцию сравнения, потребуется дополнительный код для работы с ним.