2014-03-31 93 views
0

我有一個簡單的結構C++排序陣列=>矢量迭代器不相容

struct test 
{ 
    std::vector<Data> data; 

    void sort() 
    { 
     std::sort(data.begin(), data.end()); 
    } 
} 

數據是一個結構,以及和僅具有簡單的字段和實現<操作者像以下:

編輯:改變根據反饋包括

struct Data 
{ 
    // ADAPTION 1 - comparator works with reference now 
    bool operator<(const Data &data) const 
    // bool operator<(const Data data) 
    { 
     // 1) sortieren nach Typ 
     if (type < data.type) 
      return true; 
     else if (type > data.type) 
      return false; 

     // 2) nach name sortieren 
     if(strlen(strName) > 0) 
     { 
      if (strncmp(strName, data.strName, 50) < 0) 
       return true; 
      else if (strncmp(strName, data.strName, 50) > 0) 
       return false; 
     } 
     // ADAPTION 2 - added: 
     else if (data.strName[0]) // at least 1 character... 
      return true; 

     // 3) nach Spezialtyp sortieren 
     if(strlen(typeSpecial)>0) 
     { 
      if (strncmp(typeSpecial, data.typeSpecial, 50) < 0) 
       return true; 
      else if (strncmp(typeSpecial, data.typeSpecial, 50) > 0) 
       return false; 
     } 
     // ADAPTION 3 - added: 
     else if (data.strName[0]) // at least 1 character... 
      return true; 

     return false; 
    } 
} 

就是這樣。我怎樣才能得到這樣的vector iterators incompatible錯誤?我沒有複製任何矢量,我直接調用與矢量的排序功能...

在Visual Studio 2005中,我從來沒有遇到過問題,在Visual Studio 2012中出現了這個問題,知道爲什麼,以及如何避免它

+1

我想你'運營商<'是一個類的一部分?但是什麼是'STAT_DATA'? –

+0

是的,它是數據結構的一部分...並且我編輯了我的帖子...我用一個簡單的名稱替換了STAT_DATA數據... – prom85

+1

您能引用確切的錯誤消息並指出相關行嗎? – Chnossos

回答

3

有是與您的代碼的幾個問題:

bool operator<(const Data data) 

...應該是...

bool operator<(const Data& data) const 

然後:

if(strlen(strName) > 0) 
    { 
     if (strncmp(strName, data.strName, 50) < 0) 
      return true; 
     else if (strncmp(strName, data.strName, 50) > 0) 
      return false; 
    } 

... ...需要

else if (data.strName[0]) // at least 1 character... 
     return true; 

這是必需的,以確保嚴格弱排序,這是std::sort的一個要求,意味着當a < b!(b < a)

同理:

if(strlen(typeSpecial)>0) 
    { 
     if (strncmp(typeSpecial, data.typeSpecial, 50) < 0) 
      return true; 
     else if (strncmp(typeSpecial, data.typeSpecial, 50) > 0) 
      return false; 
    } 

... ...需要

else if (data.typeSpecial[0]) 
     return true; 

如果使用std::string是你的字符串比較會更清潔。如果你堅持使用ASCIIZ數據,最好使用例如的sizeof typeSpecial代替50等。您可以通過少做比較和信任strncmp妥善處理空字符串(它將)提高性能和代碼簡潔:

if (type < data.Type) return true; 
if (type > data.Type) return false; 

int d = strncmp(strName, data.strName, sizeof strName); 
if (d == 0) 
    d = strncmp(typeSpecial, data.typeSpecial, sizeof typeSpecial); 
return d < 0; 
+0

但這並不回答實際問題。 –

+0

我會嘗試const ...其餘不是真的,雖然,看到我的函數的最後一行,它返回false ...這就是我想要的,它是一個樹狀排序功能...如果更高的水平是空或相同,我想檢查下面的排序級別...等等... – prom85

+1

「其餘是不正確的,雖然看到我的函數的最後一行,它返回false」 - 所以? 'std :: sort'要求比較具有「嚴格的弱排序」(參見[這裏](http://en.cppreference.com/w/cpp/concept/Compare))。這意味着如果'a