Как отсортировать список пар на основе второго элемента в порядке убывания в c ++ - PullRequest
1 голос
/ 03 февраля 2020

Мне было интересно, есть ли способ сортировки моего списка пар на основе второго элемента. Вот код:

std::list<std::pair<std::string, unsigned int>> words;

words.push_back(std::make_pair("aba", 23);
words.push_back(std::make_pair("ab", 20);
words.push_back(std::make_pair("aBa", 15);
words.push_back(std::make_pair("acC", 8);
words.push_back(std::make_pair("aaa", 23);

Я хотел бы отсортировать слова моего списка по целочисленному элементу в порядке убывания, чтобы мой список был похож на:

<"aba", 23>,<"aaa", 23>,<"ab", 20>,<"aBa", 15>,<"acC", 8>

Также есть их можно отсортировать как по первому, так и по второму элементу, так что сначала они сортируются по вторым элементам (по целочисленному значению), а затем, если есть две или более пар с одинаковым вторым элементом (т.е. одинаковым целочисленным значением), тогда сортируйте те, которые основаны на первом элементе в алфавитном порядке, тогда первые 2 пары в моем отсортированном списке выше поменялись местами, поэтому:

<"aaa", 23>,<"aba", 23>,<"ab", 20>,<"aBa", 15>,<"acC", 8>

Ответы [ 2 ]

4 голосов
/ 03 февраля 2020

Я хотел бы отсортировать мой список слов на основе целочисленного элемента в в порядке убывания

Предикат сортировки должен возвращать true если первый переданный элемент (т. е. первая пара) предшествует второму в установленном вами порядке:

words.sort([](auto const& a, auto const& b) {
      return a.second > b.second;
});

Поскольку вы хотите отсортировать список в в порядке убывания , пара a будет предшествовать b, если его второй элемент (т. Е. int) больше, чем второй элемент b.


Обратите внимание, что std::sort() не работает для сортировки std::list, поскольку требует итераторов произвольного доступа , но std::list предоставляет только двунаправленных итераторов .


можно ли отсортировать их как по первому, так и по второму элементу так, чтобы он сначала сортировал по вторым элементам (по целочисленному значению), а затем, если есть две или более пар с одинаковым вторым элементом (то есть с одинаковым целочисленным значением), то отсортировать те, которые основаны на первом элементе в алфавитном порядке order

Принимая снова уменьшающийся порядок для элемента int, просто прибегните ко второму элементу пар, когда оба элемента int одинаковы:

   lst.sort([](auto const& a, auto const& b) {
      if (a.second > b.second)
         return true;
      if (a.second < b.second)
         return false;
      return a.first < b.first;
   });

или более кратко благодаря std::tie():

lst.sort([](auto const& a, auto const& b) {
    return std::tie(b.second, a.first) < std::tie(a.second, a.first);
 });
1 голос
/ 03 февраля 2020

std::list имеет функцию-член std::list::sort, которая должна выполнять сортировку.

Одна из двух перегрузок принимает пользовательскую функцию сравнения:

template <class Compare>
void sort(Compare comp);

, который вы можете использовать следующим образом:

words.sort([](const std::pair<string, unsigned int> &x,
              const std::pair<string, unsigned int> &y)
{
    return x.second > y.second;
});
...