zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    类的加载次序与继承
    十进制转二进制算法
    面象对象与面象过程内存分区
    C/C++单向链表
    字符串与数字互相转换算法
    C#模拟进度条
    数据类型与类型转
    win7删除一些顽固的文件夹
    快速卸载VS2015的办法
    Js获取图片原始宽高
  • 原文地址:https://www.cnblogs.com/cthu/p/5158509.html
Copyright © 2011-2022 走看看