C++ “错误”;向量迭代器不兼容“;连接两个STL向量时

C++ “错误”;向量迭代器不兼容“;连接两个STL向量时,c++,vector,stl,concatenation,C++,Vector,Stl,Concatenation,按照关于的建议,我正试图这样做。但是,在运行时,我得到一个错误“向量迭代器不兼容”,如下所示: std::vector<SE> all; all.insert(all.end(),p->ev.begin(),p->ev.end()); std::vector all; all.insert(all.end(),p->ev.begin(),p->ev.end()); 其中p指向的类包含一个成员 std::vector<SE> ev; std::向量ev;

按照关于的建议,我正试图这样做。但是,在运行时,我得到一个错误“向量迭代器不兼容”,如下所示:

std::vector<SE> all;
all.insert(all.end(),p->ev.begin(),p->ev.end());
std::vector all;
all.insert(all.end(),p->ev.begin(),p->ev.end());
其中p指向的类包含一个成员

std::vector<SE> ev;
std::向量ev;
向量ev可能为空,在这种情况下,我希望“all”保持不变。否则,我希望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。

我尝试了这个,它似乎工作正常

#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;
}
#包括
#包括
结构P{
P(){
电动推回(3);
ev.推回(4);
}
std::向量ev;
};
int main(int argc,字符**argv){
std::矢量all;
全部。推回(1);
全部。推回(2);
P*P=新的P();
all.insert(all.end(),p->ev.begin(),p->ev.end());
复制(all.begin()、all.end()、std::ostream_迭代器(std::cout));
删除p;
返回0;
}
如果SE类型在某个地方被重新定义(可能是一个typedef?),我唯一能给出这个错误的就是。对于上面使用基本类型的示例,不应该存在问题


按顺序生成1,2,3,4。如果ev为空,那么我们得到1,2,正如您所问的

显然这是Visual Studio 2010中的一个bug

VisualStudio有一个功能“检查迭代器”。在调试构建中,每个迭代器操作都会在运行时检查错误,例如超出范围。我的pgm没有通过其中一项检查,即插入的向量范围的迭代器来自同一个集合类(即,在本例中,来自同一个向量)。正如您从我的代码示例中看到的,它们是,所以测试结果是不正确的

如果插入的向量(在我的示例中为p->ev)与目标向量('all')在同一个类中,则测试工作正常,但如果插入的向量在不同的类中,则测试工作正常。这就是罗尼没有发现问题的原因之一,即使他使用的是VS2010

对于任何可能遇到同样困难的人,“治愈”是通过定义C++预处理器变量yTraceTebug 0级来禁用迭代检查。有关为此目的使用_SECURE_SCL的Microsoft文档不正确

禁用检查后,一切正常


VS 2010中报告了一个与“擦除”相关的类似错误,据称已修复。

请发布错误消息。发布更多代码和错误。错误消息整体上是“向量迭代器不兼容”。您能否提供类
p
指向定义的点,以及如何创建p?到目前为止,
p
似乎没有初始化属性。类p{std::vector ev}。在包含all.insert的类中创建p;它有一个成员“P pArray[300]”。我知道p是有效的,因为我可以在调试器中看到它的数据。另外,p->ev.begin在调试器中显示了类p中正确的SE。我想知道为什么insert不能像广告那样工作。我知道还有其他方法可以完成这项任务。一个不同之处是你将ev作为整数的向量,而不是SEs的向量。SE是一个包含多个int和float成员的结构,其中一个成员是一个结构数组——并不复杂。SE仅在一个位置定义,不用于任何TypeDef。另一个区别是,如我的代码所示,“all”一开始是空的。std库上的算法在类型上没有区别,所以不管它是int还是其他结构,只要在所有情况下都是相同的。另外,“all”是否为空也不会对insert()产生影响,因为all.end()是您是否插入的位置。我不认为这两个选项都很重要,但我想我会提到它们。VisualStudio使用了一种称为“已检查迭代器”(Checked Iterators)的功能,正是这种功能生成了错误消息。尝试此操作时是否使用Visual Studio?