繁体   English   中英

连接两个STL向量时出现错误“向量迭代器不兼容”

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM