簡體   English   中英

C ++排序數組=>向量迭代器不兼容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM