分段错误: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<
或 operator>
满足此要求。但是operator<=
和operator>=
没有。
如果您将比较函数更改为:
auto comp = [](const string& first, const string& second)->bool
return first.compare(second) < 0;
;
它会起作用的。当然,这与您获得的默认功能在功能上相同,因此您可以这样做:
sort(v.begin(), v.end());
【讨论】:
以上是关于分段错误:C++ 使用 lambda 比较器对字符串向量进行排序的主要内容,如果未能解决你的问题,请参考以下文章