vector iterators incompatible

字面翻译迭代器类型不兼容数组

今天同事遇到的这个问题算是一个习惯性写法的问题。描述一下代码: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

相关文章
相关标签/搜索