【问题标题】:Error "vector iterators incompatible" when concatenating two STL vectors连接两个 STL 向量时出现“向量迭代器不兼容”错误
【发布时间】:2013-07-01 19:37:50
【问题描述】:

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

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。我不知道“拥有容器”是什么意思。

【问题讨论】:

  • 请发布错误信息。
  • 发布更多代码和错误。
  • 错误消息的全部内容是“向量迭代器不兼容”。
  • 您能否提供类p 指向定义以及如何创建p?到目前为止,p 似乎没有初始化属性。
  • 类 P{std::vector ev}。创建 p 是在包含 all.insert 的类中;它有一个成员'P pArray [300]'。我知道 p 是有效的,因为我可以在调试器中看到它的数据。此外,p->ev.begin 在调试器中显示来自 P 类的正确 SE。

标签: c++ vector stl concatenation


【解决方案1】:

我试过了,好像没问题

#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 就像你问的那样

【讨论】:

  • 一个区别是您将 ev 设为整数向量,而不是 SE 向量。 SE 是一个具有多个 int 和 float 成员的结构,其中一个成员是一个结构数组——没什么复杂的。 SE 只在一个地方定义,并且没有在任何类型定义中使用。另一个区别是,如我的代码所示,“all”一开始是空的。
  • std 库中的算法不区分类型,所以不管是 int 还是其他结构,只要在所有情况下都相同。此外,'all' 是否为空不会对 insert() 产生影响,因为 all.end() 是您插入的位置
  • 我没想到这些都重要,但我想我会提到它们。 Visual Studio 使用名为“Checked-Iterators”(here) 的东西,正是这个功能生成了错误消息。您在尝试此操作时使用的是 Visual Studio 吗?
【解决方案2】:

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

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

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

【讨论】:

  • 我想知道为什么插入不能像宣传的那样工作。我知道还有其他方法可以完成任务。
【解决方案3】:

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

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

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

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

禁用检查后,一切正常。

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

【讨论】:

    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 2021-12-20
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2012-01-15
    相关资源
    最近更新 更多