vector iterators incompatible
字面翻译迭代器类型不兼容
今天同事遇到的这个问题算是一个习惯性写法的问题。描述一下代码:
struct Track{};
class BaseTrack
{
…
std::vector<Track> GetTrackSourceList();
…
};
问题所在:
void func(BaseTrack bt)
std::vector<Track>::iterator it = bt.GetTrackSourceList().begin();
for(; it != bt.GetTrackSourceList.end();++it)
重点是红色部分,传值并非传引用,没Get一次就是一块栈的空间,无法进行比较。但是这里报的错误(迭代器不兼容),不是很理解。
网上有很多这个问题的文章,虽然不是今天遇到的这个问题的原因,但是也可以很好的给与参考。
截取其中有参考价值的部分:
void _Compat(const _Myiter& _Right) const
{ // test for compatible iterator pair
if (this->_Getcont() == 0 // 判断_Myproxy是否为0,为0则报错,否则获取所属容器
|| this->_Getcont() != _Right._Getcont()) // 判断两个向量的型类是否一致
{ // report error
_DEBUG_ERROR("vector iterators incompatible");
_SCL_SECURE_INVALID_ARGUMENT;
}
}
const _Container_base12 *_Getcont() const
{ // get owning container
return (_Myproxy == 0 ? 0 : _Myproxy->_Mycont);
}
在这里我发现我那段代码中的_Myproxy是为0的,也就是说我们的类型应该不存在问题,而是向量的“链条”断掉了。
从库的跟踪中我发现向量是使用名称为“_Myproxy”、“_Mynextiter”这两个指针来寻找与之相邻的值的,在我们定义一个向量时,它便初始化一个“_Myproxy”
解决方法:改成传引用。或者使用数组存储Get的信息,然后最后将操作完的数组再set回去。
网上还有很多因为erase时被删除之后的所有迭代器无效导致的错误,解决方法:使用erase的返回值记录迭代器的下一个位置。
参考地址:
http://blog.csdn.net/olanmomo/article/details/38420907
http://stackoverflow.com/questions/8421623/vector-iterators-incompatible
vector iterators incompatible的更多相关文章
- Solve Error Debug Assertion Failed Expression vector iterators incompatible Using PCL in Release Mode of VS2010
When using PCL 1.4.0 in the release mode building under VS2010, we might sometime get the error &quo ...
- Cocos2d-x Vector——vector iterators incompatible
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- 坑爹的vector iterators incompatible错误(VS中属性页-->C/C++-->代码生成-->>运行库)
之前一直被这个错误折磨着,就是不知道问题在那,后来找了很多资料,大概都是说这是因为多个线程同时操作vector的问题(参考这里).可是我这里的代码并没有问题,因为同样的代码在别的解决方案中已经成功运行 ...
- (原)使用vectot的.end()报错:iterators incompatible
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5070672.html 参考网址: http://blog.csdn.net/yxnyxnyxnyxny ...
- vector interators incompatible
刚刚使用vector时会报错,报错内容为vector interators incompatible,后来自己进行断点发现我在构造函数内使用了memset,重置了vector向量导致报错,这是一个笔记
- vector的坑——C++primer练习6.33总结
说来惭愧,一道简单的对vector递归的题目写了一个多小时,最后还是请教了大神才改出来. 首先贴上原代码: void return_vector(vector<int>::iterator ...
- STL Vector使用
http://blog.163.com/zhoumhan_0351/blog/static/399542272010225104536463 Vector 像一个快速的数组,其具有数组的快速索引方式. ...
- STL使用迭代器逆向删除
网上有很多这种例子: void erase(vector<int> &v) { for(vector<int>::reverse_iterator ri=v.rbegi ...
- 关于strlen误用的一点记录
今天帮一个朋友查一个错误,是运行时报vector iterator incompatible,一般这种问题是向量和迭代器的类型不兼容,或者是进行迭代器判等时前后向量的结构发生变化,如erase操作之后 ...
随机推荐
- 使用 Java 创建聊天客户端-2
1.项目截图 java聊天核心代码: MyJavaChatClient ================================================================ ...
- TensorFlow(十四):谷歌图像识别网络inception-v3下载与查看结构
上代码: import tensorflow as tf import os import tarfile import requests #inception模型下载地址 inception_pre ...
- 二分算法题目训练(二)——Exams详解
CodeForces732D——Exams 详解 Exam 题目描述(google翻译) Vasiliy的考试期限将持续n天.他必须通过m门科目的考试.受试者编号为1至m. 大约每天我们都知道当天可以 ...
- luogu4208
P4208 [JSOI2008]最小生成树计数 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边 ...
- C语言中怎样定义能够保存16进制整数的变量
可以通过int 或long int存储,16进制整数说到底还是整数,16进制只是一种记数方式.例如,int x=0x16;十六进制(hexadecimal)只是计算机中数据的一种表示方法,规则是“逢十 ...
- 深入理解JVM虚拟机3:垃圾回收器详解
JVM GC基本原理与GC算法 Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Java深受大家欢迎的众多特性之一,能够帮助程 ...
- 浅谈JSONP 的本质工作原理
json 是一种数据格式jsonp 是一种数据调用的方式. 你可以简单的理解为 带callback的json就是jsonp 话说我们访问一个页面的时候 需要像另一个网站获取部分信息, 这就是所谓的跨域 ...
- 研途APP——项目需求分析
研途APP--项目需求分析 1.作业描述 项目 内容 课程 软件工程实践 作业链接 团队作业第二次-需求规格说明书 团队名称 8rookies 作业目标 作业正文 研途APP--项目需求分析 其他参考 ...
- Android 使用Intent
使用intent可以吊起其他应用 例如发送电子邮件 public void sendEmail(View view){ Intent intent = new Intent(Intent.ACTION ...
- Ionic4.x 创建页面以及页面跳转
创建页面: 1.cd 到项目目录 2.通过ionic g page 页面名称 3.创建完成组件以后会在 src 目录下面多一个 button 的目录,它既是一个页面也是一个 模块. 4.如果我们想在 ...