我有一个简单的结构
struct test
{
std::vector<Data> data;
void sort()
{
std::sort(data.begin(), data.end());
}
}
数据也是一个结构,只有简单的字段并实现了&lt;运算符如下:
编辑:根据反馈进行更改
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中出现了这个问题,我不知道为什么以及如何避免它
答案 0 :(得分: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;