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

posted on 2016-01-25 19:27  cthu  阅读(791)  评论(0编辑  收藏  举报

导航