0

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

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

4

3 回答 3

0

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

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

更新:起初我没有看到你的链接,但会留下我的答案。

于 2013-07-03T23:14:14.853 回答
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 如你所问

于 2013-07-03T23:19:33.573 回答
0

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

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

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

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

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

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

于 2013-07-05T17:17:53.057 回答