字面翻译迭代器类型不兼容数组
今天同事遇到的这个问题算是一个习惯性写法的问题。描述一下代码:this
struct Track{};.net
class BaseTrack翻译
{指针
…blog
std::vector<Track> GetTrackSourceList();get
…it
};io
问题所在:class
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