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