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

时间:2016-09-11 07:11:14

标签: c++ string sorting 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;
} 

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

1 个答案:

答案 0 :(得分:6)

您的比较功能无效。它在无反射性( comp(x,x)永远不应该是真的)和不对称性(如果comp(x,y)为真,那么comp(y,x)必须为假)都失败了),这两者都是strict weak ordering的一部分,std::sort需要其比较器。 operator<operator>满足此要求。但operator<=operator>=没有。

如果您将比较功能更改为:

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

它会起作用。当然,这在功能上与默认值相同,所以你可以这样做:

sort(v.begin(), v.end());