字面翻譯迭代器類型不兼容數組
今天同事遇到的這個問題算是一個習慣性寫法的問題。描述一下代碼: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