2013-07-03 117 views
0

按照關於this question的建議,我試圖做到這一點。然而,在運行時我得到一個錯誤「向量迭代器不兼容」,如下所示:連接兩個STL向量時出現「向量迭代器不兼容」錯誤

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

其中類由p指向包含一個成員

std::vector<SE> ev; 

這是可能的矢量EV是空的,在這種情況下,我希望'全部'保持不變。否則,我希望p-> ev的所有元素都以'all'的順序添加到'all'的末尾。

我在做什麼錯?

Visual Studio 2010的C++,32位的Windows XP

附加信息:使用調試器,我已經跟蹤的錯誤消息的近因作爲P-> ev.begin的 「擁有容器」()爲0.我不知道「擁有容器」的含義。

+2

請發佈錯誤信息。 –

+1

發佈更多代碼和錯誤。 –

+0

錯誤消息的完整內容是「矢量迭代器不兼容」。 – Woody20

回答

0

我首先想到的是去嘗試這樣

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

更新的東西:我沒有看到你在第一個鏈接,但將留下我anwser。

+0

我想知道爲什麼插入不能像廣告一樣工作。我知道還有其他方法可以完成這項任務。 – Woody20

0

我想這和它似乎工作確定

#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。如果電動車是空的,那麼我們得到的1,2-你問

+0

一個區別是你使得ev成爲整數的矢量,而不是SE。 SE是一個有幾個int和float成員的結構,一個成員是一個結構數組 - 沒有什麼複雜的。 SE僅在一個地方定義,並未在任何類型定義中使用。另一個區別是,如我的代碼所示,'all'開始是空的。 – Woody20

+0

std庫上的算法不區分類型,只要在所有情況下都是相同的,它是int還是其他結構都無關緊要。此外,無論是'全部'是空的還是不會對insert()都有所幫助,因爲all.end()是您插入的位置 – Ronnie

+0

我沒有想到其中任何一個都應該重要,但我想我會提及它們。 Visual Studio使用了一個名爲「Checked-Iterators」([here](http://www.codeproject.com/Articles/17745/Checked-Iterators))的東西,並且這個功能會生成錯誤消息。當您嘗試使用Visual Studio時,是否使用了Visual Studio? – Woody20

0

顯然,這是在Visual Studio 2010

Visual Studio中有「檢查的迭代器」功能的錯誤。在調試版本中,每個迭代器操作都會在運行時發生錯誤,例如超出範圍。我的pgm失敗了其中一個檢查,即插入的向量範圍的迭代器來自同一個集合類(即,在這種情況下,來自同一個向量)。正如你從我的代碼示例中看到的那樣,所以測試結果不正確。

如果插入的向量(p-> ev,在我的示例中)與目標向量('all')在同一個類中,但如果插入的向量不在同一個類中,則測試正常工作。這是原因之一,爲什麼羅尼沒有看到這個問題,即使他用VS 2010

對於誰可能會遇到此相同困難的人,「治療」是禁用的迭代器檢查,通過定義C++預處理器變量_ITERATOR_DEBUG_LEVEL爲0.有關爲此使用_SECURE_SCL的Microsoft文檔不正確。

在禁止檢查的情況下,一切都按預期工作。

在VS 2010中報告了一個類似的錯誤,據稱這個錯誤在「擦除」中被修復。