使用自定义比较功能使用std :: sort()对向量字符串进行排序时遇到问题

Prashant Singh

我正在尝试根据规则对字符串进行排序。C ++代码在大多数情况下均可运行,但在某些情况下会出现错误:

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

我之前已经看到过此错误,当我们尝试将字符串初始化为null指针或0(在内部转换为null指针)时会发生此错误。我已经检查了排序期间是否发生了错误,并且仅在使用自定义函数进行比较时才发生。再一次,我不知道为什么仅在某些情况下会发生这种情况。

代码是:

#include <algorithm>
#include <sstream>
#include <iostream>
#include <vector>
#include <string>

using std::vector;
using std::string;

bool greater(string a, string b) {
  int i = 0;
  a = a + a[0];
  b = b + b[0];
  while(i<a.size() && i<b.size()) {
    if(a[i] != b[i]) {
      if(a[i] - '0' > b[i] - '0')
      return true;
      else return false;
    }
    i++;
  }
  
}

string largest_number(vector<string> a) {
  std::sort(a.begin(), a.end(), greater);
  std::stringstream ret;
  for (size_t i = 0; i < a.size(); i++) {
    ret << a[i];
  }
  string result;
  ret >> result;
  return result;
}

int main() {
  int n;
  std::cin >> n;
  vector<string> a(n);
  for (size_t i = 0; i < a.size(); i++) {
    std::cin >> a[i];
  }
  std::cout << largest_number(a);
  return 0;
}

出现错误的情况之一是:

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

解决方案:感谢您的帮助。之所以发生错误,是因为比较函数一旦退出循环,就不会返回任何内容。这是有效的更新功能。

bool greater(string a, string b) {
  int i = 0;
  a = a + a[0];
  b = b + b[0];
  while(i<a.size() && i<b.size()) {
      if(a[i] > b[i])
        return true;
    i++;
  }
  return false; 
}
亚瑟·塔卡(Arthur Tacca)

我可以看到的代码唯一的问题(实际上我在一个在线编译器中尝试过,它给了我这个警告)是,greater如果两个字符串相等不会返回任何内容

bool greater(string a, string b) {
  int i = 0;
  a = a;
  b = b;
  while(i<a.size() && i<b.size()) {
    if(a[i] != b[i]) {
      if(a[i] - '0' > b[i] - '0')
      return true;
      else return false;
    }
    i++;
  }
  // <---- what about here?
}

尝试插入一个return语句。(当然,如果两个事物相等,那么两个事物都不大于另一个,因此特别是一个return false你想要的事物。)在没有return语句的情况下掉到函数的末尾未定义的行为(除非int main()或任何返回return的函数void),所以你可能会在发生这种情况时看到任何东西,包括崩溃的类型。

[编辑:正如gst所说,如果一个字符串是另一个字符串的前缀,例如"1"and ,您也可以理解到这一点"10"因此,您需要更多的代码来测试哪个,而不是一个return false但是您可以看到是否有一行可以解决崩溃问题:这在逻辑上是错误的,但至少不是未定义的行为。]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用自定义比较功能进行c ++排序

使用日期对数组进行排序时遇到问题

使用自定义比较的排序键功能

错误:使用自定义比较功能排序时出现“无效的比较器”

无法使用std :: sort和自定义比较器对数组进行排序

使用自定义比较器对字符串NSArray进行排序

将COUNTIF函数与子字符串功能或自定义比较一起使用

使用插入排序在 Python 中对列表进行排序时遇到问题

比较字符串时遇到问题

比较字符串时遇到问题 (PHP)

使用自定义比较功能按多列对熊猫数据框进行排序

使用自定义比较功能对列表列表进行排序

在std :: sort和std :: priority_queue中如何使用自定义比较函数的困惑

尝试使用特定模式对列表进行排序时遇到问题

使用 javaScript for 循环对数组进行排序时遇到问题

对字符串使用自定义比较器

使用 std::sort 对自定义类型的向量进行排序未按预期工作

如何仅使用自定义比较器在std :: map中进行搜索?

使用自定义比较器对ArrayList <String>进行排序

std :: sort与自定义比较器

使用AngularJS自定义排序功能对电子邮件值进行排序时出现问题

使用自定义排序顺序在Unix中对字母数字字符串进行排序

如何使用postgresql对字符串进行自定义排序的查询排序?

R:如何使用自定义比较方法对向量进行排序

在字符串向量与字符串指针向量之间进行STL排序的性能比较

绝对值排序,使用自定义比较器

使用字符串向量进行插入排序

std::sort 小写字符串向量似乎与空字符串进行比较

使用vbscript替换文件中的字符串时遇到问题