2016-09-11 61 views
1
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中得到了分段錯誤。它非常有線。誰知道發生了什麼?分段錯誤:C++用lambda比較器對字符串向量進行排序

+0

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

我無法調試到排序功能,所以我在這裏...但我應該仔細閱讀排序功能的意見。 –

+0

爲什麼你不能調試?請詳細說明。 –

回答

6

您的比較函數不是有效的。如果comp(x,y)爲真,則comp(y,x)必須爲假),兩者都是無反射性(comp(x,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()); 
+0

很清楚,非常感謝。 –

相關問題