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

相關文章
相關標籤/搜索