连接两个 STL 向量时出现错误"vector iterators incompatible"
Error "vector iterators incompatible" when concatenating two STL vectors
根据这个问题的建议,我正试图做到这一点。然而,在运行时,我得到一个错误"矢量迭代器不兼容",如下所示:
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中报告了一个与"擦除"有关的类似错误,据称已修复。
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- vector.resize()中的分配错误
- 在某些循环内使用vector.push_back时出现分段错误
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- "no matching function for call to 'Vector::Vector'"错误
- 为什么当 vector 为空时会显示运行时错误?
- 将 vector<vector<int>> 传递到函数中会产生内存错误
- C++ 向量加减抛出"expression: vector subscript out of range."错误
- 错误:调用"es_queue::set_rpc_vector(std::vector >&, std::__cxx11::string)"没有匹配函数
- AddressSanitizer 将 std::vector<T>::p ush_back 标识为释放后堆使用错误的原因
- 在c++Primer中使用Struct和Vector时出现错误C2661
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 如何解决'vector subscript out of range'错误?
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- 迭代 std::vector 时的分段错误
- 如何修复c ++中的错误"vector iterators in range are from different containers"?
- 连接两个 STL 向量时出现错误"vector iterators incompatible"
- 迭代并移除Vector中的元素.错误:Vector迭代器不可递增
- 运行时错误:vector下标超出范围
- 错误:vector未命名类型