2013-11-03 60 views
2

下面的程序,一個簡單的向量排序一個,在第二次排序調用時崩潰t> = 17。即使對於t == 100,第一次排序也會成功。 經過了相當長的時間,但我無法弄清楚什麼是錯誤的。有人可以幫幫我嗎?std :: sort(from <algorithm>)崩潰

我試過它在MacBook Air以及Linux機器上,出人意料的是,我看到了相同的結果。

#include<iostream> 
#include<vector> 
#include<algorithm> 

    using namespace std; 
    struct tc 
    { 
     unsigned int n; 
    }; 
    bool sort_by_n(tc a, tc b) 
    { 
     return a.n <= b.n; 
    } 
    vector<tc> tcv(100); 
    vector<int> tv(100); 
    int main() 
    { 
     unsigned int t; 
     cin >> t; 
     for (unsigned int i = 0 ; i < t ; i++) 
     { 
      cin >> tcv[i].n; 
      tv[i] = tcv[i].n; 
     } 
     sort(tv.begin(), tv.begin()+t); // ## This one works even for t == 100. 
     sort(tcv.begin(), tcv.begin()+t, sort_by_n); // ## This one crashes for t >= 17 
     return 0; 
    } 

回答

10

您需要提供一個嚴格弱排序,但

bool sort_by_n(tc a, tc b) 
{ 
    return a.n <= b.n; 
} 

只是一個弱勢整理。嚴格的弱訂單必須返回false如果元素是相同的。您需要將其更改爲:

bool sort_by_n(tc a, tc b) 
{ 
    return a.n < b.n; 
} 
+0

非常感謝Daniel。這工作。我很驚訝它會導致這種行爲。 – vrk001

+0

@ vrk001排序算法可能會進入無盡的遞歸,直到它用完了可用的堆棧空間,然後崩潰。 –

+0

哦,我明白了。所以,對於大小小於等於16的分類,有一種不會崩潰的處理方式,對於大於等於17的大小,這是一個不太寬容的方法!謝謝你幫助我! :-) – vrk001