当尝试对字符串向量进行排序时,C++程序崩溃

7

我正在尝试在C++中对字符串数组进行排序,但是出现了以下错误信息:

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

下面的程序引起了上述错误。当v有17个元素时,我遇到了这个错误,但是当v的元素较少时,一切正常。

有人能指出问题所在吗?我正在使用gcc版本7.5.0(Ubuntu 7.5.0-3ubuntu1〜18.04)

#include <vector>
#include <string>
#include <algorithm>

using namespace std;

bool comp (string s1, string s2) {
    if (s1.size() < s2.size())
        return false;
    else
        return true;
}

int main () {   
    vector<string> v = { "a", "a", "a", "a",
                         "a", "a", "a", "a",
                         "a", "a", "a", "a",
                         "a", "a", "a", "a",
                         "a" };
    
    sort(v.begin(), v.end(), comp);
    return 0;
}

9
std::sort 的比较器要求具有“严格弱序”。可以将其看作是“小于”。在您的设置中,“a”< “a”的结果是 _true_,这是不合理的。 - Mike Vine
5
@MikeVine说过,可以试试return s1.size() < s2.size();。顺便说一句:你的比较函数有点昂贵。将它改为bool comp (const string& s1, const string& s2) ,这样就不用每次都复制字符串了。 - Ted Lyngmo
5
通常情况下,如果你有 if (condition) { return true; } else { return false; } 这样的代码,可以直接替换成 return condition; - Some programmer dude
2
抛出异常的行为很有趣。这只会在使用按值参数进行大于或等于语义比较时发生。通过引用传递,或者使用小于号进行比较不会产生这种情况(编译器浏览器)。 - Human-Compiler
1
@Human-Compiler 此处存在未定义行为 :-) - Ted Lyngmo
显示剩余7条评论
1个回答

11

您传递给sort的比较器必须满足 Compare 命名要求

建立具有以下属性的严格弱排序关系

For all a, comp(a,a)==false
If comp(a,b)==true then comp(b,a)==false
if comp(a,b)==true and comp(b,c)==true then comp(a,c)==true
使用您的比较器:`comp(a,a) == true`。由于您未满足`std::sort`的前置条件,因此您的代码具有未定义的行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接