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

Posted

技术标签:

【中文标题】分段错误:C++ 使用 lambda 比较器对字符串向量进行排序【英文标题】:Segmentation Fault: C++ sort an string vector with lambda comparator 【发布时间】:2016-09-11 07:11:13 【问题描述】:
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 中出现分段错误。它是如此有线。谁知道怎么回事?

【问题讨论】:

调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行逐行检查您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。 我无法调试到排序函数,所以我在这里......但我应该仔细阅读排序函数的cmets。 为什么不能调试?请详细说明。 【参考方案1】:

您的比较函数无效。它在非自反性(comp(x, x) 永远不应该为真)和不对称性(如果 comp(x, y) 为真,则 comp(y, x) 必须为假),它们都是strict weak ordering 的一部分,std::sort 需要它的比较器。 operator&lt;operator&gt; 满足此要求。但是operator&lt;=operator&gt;= 没有。

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

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

它会起作用的。当然,这与您获得的默认功能在功能上相同,因此您可以这样做:

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

【讨论】:

以上是关于分段错误:C++ 使用 lambda 比较器对字符串向量进行排序的主要内容,如果未能解决你的问题,请参考以下文章

分段错误:核心转储 C++ 向量对字符串:

C++ 读取字符串分段错误

访问算法的 lambda 函数中的迭代器导致我出现分段错误

带有向量和字符串的 C++ 分段错误

C++字符串拆分分段错误

gcc,c++:静态字符串成员变量导致堆损坏/分段错误