vector iterators incompatible

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章

c++ vector<string>用iterator遍历

求教关istream_iterator 与vector 问题

std::vector::iterator失效性分析

STL.vector.iterator的序号

vector

Vector容器 和 iteration 迭代器