[英]C++ sorting array => vector iterators incompatible
我有一個簡單的結構
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
錯誤? 我沒有復制任何向量,而是直接用向量調用sort函數...
在Visual Studio 2005中,我從來沒有遇到過問題,在Visual Studio 2012中,出現了這個問題,我不知道為什么以及如何避免它
您的代碼存在一些問題:
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
則字符串比較會更加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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.