簡體   English   中英

連接兩個STL向量時出現錯誤“向量迭代器不兼容”

[英]Error “vector iterators incompatible” when concatenating two STL vectors

根據有關此問題的建議,我正在嘗試做到這一點。 但是,在運行時,出現以下錯誤“向量迭代器不兼容”:

std::vector<SE> all;
all.insert(all.end(),p->ev.begin(),p->ev.end());

p指向的類包含一個成員

std::vector<SE> ev;

向量ev可能為空,在這種情況下,我希望'all'保持不變。 否則,我希望將p-> ev的所有元素以相同的順序添加到'all'的末尾。

我究竟做錯了什么?

Visual Studio 2010 C ++,32位Windows XP

附加信息:使用調試器,我已跟蹤錯誤消息的直接原因,因為p-> ev.begin()的“擁有容器”為0。我不知道“擁有容器”是什么意思。

我的第一個想法是嘗試這樣的事情

if(!p->ev.isEmpty())
{
   foreach(SE record in p->ev)
   {
      all.insert(SE);
   }
}

更新:起初我沒有看到您鏈接,但是會離開我的答案。

我嘗試了這個,它似乎工作正常

#include <vector>
#include <iostream>

struct P {
    P() {
        ev.push_back(3);
        ev.push_back(4);
    }
    std::vector<int> ev;
};

int main(int argc,char** argv) {
    std::vector<int> all;
    all.push_back(1);
    all.push_back(2);

    P* p = new P();
    all.insert(all.end(),p->ev.begin(),p->ev.end());
    copy(all.begin(),all.end(),std::ostream_iterator<int>(std::cout));
        delete p;
    return 0;
}

我唯一能給出該錯誤的事情是,如果在某處重新定義了SE類型(可能是typedef?)。 對於上面使用基本類型的示例,應該沒有問題。

按順序產生1,2,3,4。 如果ev為空,則按照您的要求得到1,2

顯然,這是Visual Studio 2010中的錯誤。

Visual Studio具有“檢查的迭代器”功能。 在調試版本中,每個迭代器操作都會在運行時被檢查是否存在錯誤,例如超出范圍。 我的pgm無法通過這些檢查之一,即所插入向量范圍的迭代器來自同一集合類(即,在這種情況下,來自同一向量)。 從我的代碼示例中可以看到,它們是正確的,因此測試結果不正確。

如果要插入的向量(在我的示例中為p-> ev)與目標向量屬於同一類(“ all”),則該測試正常進行,但是如果要插入的向量位於不同的類中,則該測試無法正常進行。 這就是Ronnie即使使用VS 2010卻看不到問題的原因之一。

對於可能遇到相同困難的任何人,“治愈”是通過將C ++預處理程序變量_ITERATOR_DEBUG_LEVEL定義為0來禁用迭代器檢查。為此目的使用_SECURE_SCL的Microsoft文檔是不正確的。

禁用檢查后,一切都會按預期進行。

VS 2010中報告了一個類似的錯誤,並據稱已修復,該錯誤與“擦除”有關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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