连接两个STL向量时出现“向量迭代器不兼容”错误
按照关于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.我不知道“拥有容器”的含义。
我首先想到的是去尝试这样
if(!p->ev.isEmpty())
{
foreach(SE record in p->ev)
{
all.insert(SE);
}
}
更新的东西:我没有看到你在第一个链接,但将留下我anwser。
我想知道为什么插入不能像广告一样工作。我知道还有其他方法可以完成这项任务。 – Woody20
我想这和它似乎工作确定
#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-你问
一个区别是你使得ev成为整数的矢量,而不是SE。 SE是一个有几个int和float成员的结构,一个成员是一个结构数组 - 没有什么复杂的。 SE仅在一个地方定义,并未在任何类型定义中使用。另一个区别是,如我的代码所示,'all'开始是空的。 – Woody20
std库上的算法不区分类型,只要在所有情况下都是相同的,它是int还是其他结构都无关紧要。此外,无论是'全部'是空的还是不会对insert()都有所帮助,因为all.end()是您插入的位置 – Ronnie
我没有想到其中任何一个都应该重要,但我想我会提及它们。 Visual Studio使用了一个名为“Checked-Iterators”([here](http://www.codeproject.com/Articles/17745/Checked-Iterators))的东西,并且这个功能会生成错误消息。当您尝试使用Visual Studio时,是否使用了Visual Studio? – Woody20
显然,这是在Visual Studio 2010
Visual Studio中有“检查的迭代器”功能的错误。在调试版本中,每个迭代器操作都会在运行时发生错误,例如超出范围。我的pgm失败了其中一个检查,即插入的向量范围的迭代器来自同一个集合类(即,在这种情况下,来自同一个向量)。正如你从我的代码示例中看到的那样,所以测试结果不正确。
如果插入的向量(p-> ev,在我的示例中)与目标向量('all')在同一个类中,但如果插入的向量不在同一个类中,则测试正常工作。这是原因之一,为什么罗尼没有看到这个问题,即使他用VS 2010
对于谁可能会遇到此相同困难的人,“治疗”是禁用的迭代器检查,通过定义C++预处理器变量_ITERATOR_DEBUG_LEVEL为0.有关为此使用_SECURE_SCL的Microsoft文档不正确。
在禁止检查的情况下,一切都按预期工作。
在VS 2010中报告了一个类似的错误,据称这个错误在“擦除”中被修复。
请发布错误信息。 –
发布更多代码和错误。 –
错误消息的完整内容是“矢量迭代器不兼容”。 – Woody20