对 c++ 向量<string>进行排序

Sorting c++ vector<string>

本文关键字:排序 gt string c++ lt 向量      更新时间:2023-10-16

我想对练习的字符串向量进行排序。这些字符串只有从 0 到 9 的数字,如 [ 10 2 1 9 91 ],我想排序为 [ 9 91 2 1 10 ] 以达到最大的数字 ( 9912110 )。我使用 sort 函数执行了以下代码

#include <algorithm>
#include <sstream>
#include <iostream>
#include <vector>
#include <string>
using std::vector;
using std::string;
bool compare(string i1, string i2) 
{ 
     int a, b;
     int i = 0;
     int min_len = (i1.length() > i2.length()) ? i2.length(): i1.length();
     while(i < min_len) {
          a = (int) (i1.at(i) - '0');
          b = (int) (i2.at(i) - '0');
          if (a != b)
             break;
          i++;
     }
     if (a > b)
        return true; 
     if (a < b)
        return false; 
     if (i1.length() > i2.length())
        return false;
     return true;
} 
int main() {
    int n;
    std::cin >> n;
    vector<string> a(n);
    for (size_t i = 0; i < a.size(); i++) {
        std::cin >> a[i];
    }
    sort(a.begin(), a.end(), compare);
 }

问题是当我使用参数执行时:

100
2 8 2 3 6 4 1 1 10 6 3 3 6 1 3 8 4 6 1 10 8 4 10 4 1 3 2 3 2 6 1 5 2 9 8 5 10 8 7 9 6 4 2 6 3 8 8 9 8 2 9 10 3 10 7 5 7 1 7 5 1 4 7 6 1 10 5 4 8 4 2 7 8 1 1 7 4 1 1 9 8 6 5 9 9 3 7 6 3 10 8 10 7 2 5 1 1 9 9 5

给我以下错误:

terminate called after throwing an instance of 'std::logic_error'
what():  basic_string::_M_construct null not valid
Aborted

但是如果我使用 99 执行并删除最后一个数字,它可以正常工作。如果我尝试超过 100(如 101 或 102 ......我想错误出在compare函数中。

编辑:

 bool compare(const std::string& i1, const std::string& i2) 
 { 
      int i = 0;
      int min_len = (i1.length() > i2.length()) ? i2.length(): i1.length();
      while (i < min_len) {
            int a = (int) (i1.at(i) - '0');
            int b = (int) (i2.at(i) - '0');
            if (a > b)
               return true; 
            if (a < b)
               return false; 
            i++;
      }
      return (i1.length() < i2.length());
 }
给定相

等的参数,std::sort的比较函数应始终返回 false。但是您的函数返回 true。尝试以下修改

bool compare(string i1, string i2) 
{ 
     ...
     if (a > b)
        return true; 
     if (a < b)
        return false; 
     return i1.length() < i2.length();
} 

我猜正在发生的事情是,当您的平台上,当要排序的序列大小为>= 100 时,在您的平台上std::sort选择不同的算法。对于这种不同的算法,满足比较函数的要求至关重要。

虽然已经给出了实际问题的答案,但您的比较算法不适合获得所需的结果!

请考虑以下示例:

情况 1:[99, 991] – 您需要先对较短的字符串进行排序以获得99991而不是99199

情况 2:[91, 919] – 您需要先对较长的排序以获得91991而不是91919

虽然字典比较(这是您实现的)可以按公共长度对字符串进行排序,但如果字符串在其公共长度上比较相等,则标准"长度"不能用于决定首先对哪个字符串进行排序!

但是,您可以执行以下操作:

std::sort
(
    a.begin(), a.end(),
    [](std::string x, std::string y)
    {
        std::string xy = x + y;
        std::string yx = y + x;
        return xy > yx;
    }
);

即首先对一个字符串进行排序,如果与另一个字符串连接,则在较大的值中产生。