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

时间:2013-07-03 22:59:57

标签: c++ vector stl concatenation

根据this question的建议,我正试图这样做。但是,在运行时我得到一个错误“vector iterators incompatible”,如下所示:

std::vector<SE> all;
all.insert(all.end(),p->ev.begin(),p->ev.end());

p指向的类包含成员

std::vector<SE> ev;

矢量ev可能为空,在这种情况下我希望'all'不变。否则,我希望p-&gt; ev的所有元素在'all'的末尾以相同的顺序添加到'all'。

我做错了什么?

Visual Studio 2010 C ++,32位Windows XP

附加信息:使用调试器,我已经跟踪错误消息的近因,因为p-> ev.begin()的“拥有容器”为0.我不知道“拥有容器”是什么意思

3 个答案:

答案 0 :(得分:0)

我的第一个想法是尝试这样的事情

if(!p->ev.isEmpty())
{
   foreach(SE record in p->ev)
   {
      all.insert(SE);
   }
}

更新:我一开始没有看到你的链接,但会留下我的回答。

答案 1 :(得分: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。如果ev是空的,那么我们会按你的要求得到1,2

答案 2 :(得分:0)

显然这是Visual Studio 2010中的一个错误。

Visual Studio具有“Checked Iterators”功能。在调试版本中,每个迭代器操作在运行时都会因错误(例如超出范围)而被跟踪。我的pgm失败了其中一个检查,即插入的向量范围的迭代器来自同一个集合类(在本例中,来自同一个向量)。从我的代码示例中可以看出,它们是,所以测试结果不正确。

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

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

禁用检查后,一切都按预期工作。

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