gpt4 book ai didi

C++ 排序数组 => vector 迭代器不兼容

转载 作者:行者123 更新时间:2023-11-28 00:31:27 24 4
gpt4 key购买 nike

我有一个简单的结构

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 错误呢?我没有复制任何 vector ,我直接用 vector 调用排序函数...

在 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,您的字符串比较会更清晰秒。如果您坚持使用 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;

关于C++ 排序数组 => vector 迭代器不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22756671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com