Работа sort () в c ++ при сортировке строк - PullRequest
1 голос
/ 23 февраля 2020

Я решал проблему, QuestionsLink , где нам дают имя вместе с целым числом. Вы должны напечатать три имени с максимальными целочисленными значениями.

Итак, я преобразовал число в строку и конкатенировал его перед именами. После сортировки я получал желаемые результаты. Но он провалил некоторые тестовые случаи, и мне стало интересно, как работает функция сортировки в c ++.

Вот мой код:

#include <bits/stdc++.h>
#define ll long long int

using namespace std;

int main() {

  ll n;
  cin >> n;

  string names[n];
  int arr[n], digits[n];

  for (int i = 0; i < n; i++) {
    cin >> names[i] >> arr[i];
    names[i] = to_string(arr[i]) + names[i];
  }

  for (int i = 0; i < n; i++) {
    digits[i] = floor(log10(arr[i]) + 1);
  }

  sort(names, names + n, greater<string>());

  for (int i = 0; i < n; i++) {
    cout << names[i] << endl;
  }
  /*for(int i=0;i<3;i++){
     string s = names[i].substr(digits[i],names[i].length());
     cout<<s<<endl;
   }
   cout<<digits[98];
 */
  return 0;
}

Контрольные примеры:

9huDmy
995YnAYoAEE
990RUTM
96ipORo
956LNjFa 

Итак, после сортировки по убыванию, как 9huDmy сверху, в то время как следующие два отсортированы на основе цифр перед ними.

1 Ответ

3 голосов
/ 23 февраля 2020

Поскольку greater<string> сортирует числа меньше символов, основываясь на их значении ASCII.

Вы не должны были их объединять в первую очередь.

1) Использовать std::pair< int, std::string > для группировки целых чисел и строк.

2) Используйте std::vector< std::pair< int, std::string > >, а не C массивы.

3) Напишите функтор сравнения (или лямбду), который сортирует пары в зависимости от их значение int. Сравнение std::pair автоматически сравнивает их .first элемент, то есть ваши целочисленные значения.


4) Используйте подробный std:: или using std::string et c, не using namespace ..., поскольку ваше глобальное пространство имен очень быстро заполняется.

...