连接两个 STL 向量时出现错误"vector iterators incompatible"

Error "vector iterators incompatible" when concatenating two STL vectors

本文关键字:错误 vector incompatible iterators 向量 STL 两个 连接      更新时间:2023-10-16

根据这个问题的建议,我正试图做到这一点。然而,在运行时,我得到一个错误"矢量迭代器不兼容",如下所示:

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

其中p指向的类包含成员

std::vector<SE> ev;

向量ev可能为空,在这种情况下,我希望"all"保持不变。否则,我希望p->ev的所有元素都以相同的顺序添加到"all"中,位于"all"的末尾。

我做错了什么?

Visual Studio 2010 C++,32位Windows XP

附加信息:使用调试器,我已经追踪到错误消息的直接原因,因为p->ev.begin()的"拥有容器"为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,正如您所要求的

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

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

更新:我一开始没有看到你的链接,但会离开我的anwser。

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

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

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

对于任何可能遇到同样困难的人来说,"解决方法"是通过将C++预处理器变量_iterator_DEBUG_LEVEL定义为0来禁用迭代器检查。有关为此目的使用_SECURE_SCL的Microsoft文档不正确。

禁用检查后,一切正常。

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