【问题标题】:Working of sort() in c++ while sorting strings在对字符串进行排序时在 C++ 中使用 sort()
【发布时间】:2020-02-23 19:21:52
【问题描述】:

我正在解决一个问题,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 如何在顶部,而接下来的两个是根据它们前面的数字排序的。

【问题讨论】:

  • 'h' (104) 的 ASCII 码大于'9' (57) 或任何其他数字的 ASCII 码。这就是为什么。
  • 不要使用#include &lt;bits/stdc++.h&gt; (Why should I not #include <bits/stdc++.h>?),使用小写字母定义 (#define ll long long int) 会导致许多意想不到的问题,请改用using (using ll = unsigned long long;)。动态大小数组 (string names[n]) 不是标准 c++,而是使用标准容器的扩展。
  • 我想在@T.niese 中扩展:不要使用“竞争性编码”环境来学习一门语言(任何语言)。竞争性编码在所有错误的地方进行了优化,而 DE 强调了您在“真实”程序中想要的那些东西——可读性、可维护性、模块化。

标签: c++ arrays sorting c++14


【解决方案1】:

因为greater&lt;string&gt; 根据 ASCII 值将数字排序为小于字符。

你一开始就不应该把它们串联起来。

1) 使用std::pair&lt; int, std::string &gt; 对整数和字符串进行分组。

2) 使用std::vector&lt; std::pair&lt; int, std::string &gt; &gt;,而不是 C 数组。

3) 编写一个比较器仿函数(或 lambda),根据它们的 int 值对对进行排序。 比较 std::pair 会自动比较它们的 .first 元素,即您的整数值。


4) 使用详细的 std::using std::string 等,而不是 using namespace ...,因为您的全局命名空间会很快变得非常拥挤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2019-06-09
    • 2013-11-21
    • 2021-05-22
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多