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

时间:2014-03-31 08:18:22

标签: c++ sorting vector

我有一个简单的结构

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中出现了这个问题,我不知道为什么以及如何避免它

1 个答案:

答案 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;