2013-07-03 94 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中报告了一个类似的错误,据称这个错误在“擦除”中被修复。