Блог пользователя Borisov

Автор Borisov, 10 лет назад, По-русски

Добрый день, стало вдруг интересно и я решил узнать у вас, можно ли как-то сортировать

массив пар, либо по ключам, либо по значениям, используя стандартный sort()?

И какие еще интересные вещи можно делать с массивом пар?

Заранее благодарен!

  • Проголосовать: нравится
  • +9
  • Проголосовать: не нравится

»
10 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

Стандартно, оно будет сортить по полю first по возрастанию. Если поля first совпадают, то сортит по возрастанию second. Если так не подходит, то надо писать компаратор и передавать в sort параметром.

»
10 лет назад, # |
Rev. 5   Проголосовать: нравится +8 Проголосовать: не нравится

Например так:

typedef pair <int,int> point;
bool cmp (point p1, point p2) {
  return p1.first > p2.first;
}
vector <point> a;
sort(a.begin(),a.end(),cmp)
  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится

    К слову, в стандартной библиотеке есть уже готовый шаблонный компаратор greater, чтобы сортить по убыванию:

    sort(a.begin(), a.end(), greater<point>())
    
»
10 лет назад, # |
Rev. 3   Проголосовать: нравится +3 Проголосовать: не нравится

Если вы пишите что-то вроде такого:

vector <pair <int, int> > a;

...

sort( a.begin(), a.end() );

...

В результате получите массив отсортированный по первому значению (при сравнении 2 элементов с одинаковыми первыми значениями то сравнение будет выполняться по 2 значению).

Пример: было — (0, 0) (1, 3) (0, 4) (100, 4) (1, 1) стало — (0, 0) (0, 4) (1, 1) (1, 3) (100, 4)

Если хотите отсортировать массив пар по значению 2 ключа нужно для функции сорт переопределить функцию сравнения. На пример так:

  • bool comp(pair<int, int> a, pair<int, int> b)
  • {
  • if (a.second == b.second)
  • return (a.first < b.first);
  • return (a.second < b.second);
  • }

vector <pair <int, int> > arr;

...

sort(arr.begin(), arr.end(), comp);

...

Вообще sort может сортировать не только пары но и собственные классы (если для них определить функцию сравнения).

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    sort сортирует все, для чего определен оператор <

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      И даже то, для чего не определён оператор <, если передать третьим параметром компаратор.