根据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.我不知道“拥有容器”是什么意思
答案 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中报告了一个类似的错误,据称已修复,与“擦除”有关。