分段错误:C++使用lambda比较器对字符串向量进行排序

nol*_*iou 1 c++ sorting string lambda

int main() {
    vector<string> v(100, "0");
    auto comp = [](const string& first, const string& second)->bool {
        return first.compare(second) <= 0;
    };
    sort(v.begin(), v.end(), comp);
    for(auto s : v) {
        cout<<s<<endl;
    }
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

上面的c ++代码在g ++ v4.9.2中出现了分段错误.它是如此有线.谁知道发生了什么?

Ben*_*ley 6

您的比较功能无效.它未能无论是在irreflexivity(补偿(X,X)不应该是真实的)和非对称(如果comp(X,Y)为真,则补偿(Y,X)一定是假的),这两者都是部分严格弱序std::sort需要它的比较.operator<operator>满足此要求.但是operator<=,operator>=不要.

如果您将比较函数更改为:

auto comp = [](const string& first, const string& second)->bool {
    return first.compare(second) < 0;
};
Run Code Online (Sandbox Code Playgroud)

它会工作.当然,这在功能上与默认的相同,所以你可以这样做:

sort(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)