【问题标题】:C++ std::length_error when using ternary operator?使用三元运算符时的C++ std::length_error?
【发布时间】:2021-03-24 14:29:57
【问题描述】:

我正在使用 C++ 解决 LeetCode 问题,我想给 std::sort() 一个自定义的 lambda 比较器:

sort(vec.begin(),vec.end(),[](string& a, string& b){
   return (a+b < b+a) ? false : true;        
});

当我的代码在以下测试用例上进行测试时:

//Edited:Assume this is an array of string, not int
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

编译器给了我以下错误:

terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_M_create

然后我查看了其他人的解决方案,发现他们写的三元运算符是:

return a+b > b+a;

以上代码编译正确,没有任何错误。我想知道是否有人可以解释为什么我的原始代码不起作用?

【问题讨论】:

  • @Yunnosch 怎么样?
  • “我想知道是否有人可以解释为什么我的原始代码不起作用?” 如果我们能看到的话,也许我们可以。向我们展示您的minimal reproducible example
  • 您是在对整数或字符串向量进行排序吗?
  • @Shawn 在代码中字面意思是字符串。
  • @AsteroidsWithWings 给定的测试用例是一堆 0,看不到字符串。

标签: c++ string conditional-operator


【解决方案1】:

您的比较器不符合requirements for comparators。例如,如果ab 都是"X",那么a+bb+a 就是"XX"。然后,comp(a,b)comp(b,a) 在您的情况下都返回 true,而 comp(a,a)true,这违反了比较器的规则。即,这些特定规则:

  • 所有a, comp(a,a)==false
  • 如果comp(a,b)==true 那么comp(b,a)==false

您可以将比较器更改为定义严格弱排序的东西,例如:

[](const string& a, const string& b)
{
  return (a + b > b + a);
}

请注意,如果字符串相等,此比较器不会返回 true

【讨论】:

  • 感谢您的意见。我现在了解比较器的要求。但除此之外,为什么我的代码会导致“std::length_error”?
  • @MikeL 因为当您违反 C++ 规则时,通常意味着 未定义的行为。询问未定义的行为通常没有意义。要了解实际发生的情况,您可能需要研究所有涉及的源代码和生成的程序集。
猜你喜欢
  • 2011-09-30
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
相关资源
最近更新 更多