STL有三大核心部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),容器適配器(container adaptor),函數對象(functor),除此以外還有STL其餘標準組件,若是你使用容器不當,就會發生list iterators incompatible/vector iterators incompatible 的錯誤,報錯如圖:c++
若是你trace代碼,你能夠看到以下代碼:算法
bool operator==(const _Myiter& _Right) const { // test for iterator equality #if _ITERATOR_DEBUG_LEVEL == 2 if (this->_Getcont() == 0 || this->_Getcont() != _Right._Getcont()) { // report error _DEBUG_ERROR("list iterators incompatible"); _SCL_SECURE_INVALID_ARGUMENT; } #elif _ITERATOR_DEBUG_LEVEL == 1 _SCL_SECURE_VALIDATE(this->_Getcont() != 0 && this->_Getcont() == _Right._Getcont()); #endif /* _ITERATOR_DEBUG_LEVEL */ return (this->_Ptr == _Right._Ptr); } bool operator!=(const _Myiter& _Right) const { // test for iterator inequality return (!(*this == _Right)); } };
這個錯誤是「list iterators incompatible」,提示向量與迭代器不兼容,可是這很明顯是不可能的(除非你故意這麼作);若是你對容器操做不熟悉,你可能犯一下錯誤:編程
One:類型不匹配,例如用int型的向量迭代器與char型的向量迭代器進行比對操做。犯此錯誤的概率不大,除非你的本身的程序架構都不熟悉,而且不知道本身在作什麼;架構
Two: 比對時容器的結構發生變化,例如:函數
for (vector<int>::iterator i= vector.begin(); i != vector.end(); i++) this
{ spa
vector.erase(i); code
} 對象
在erase操做後,沒有將循環變量i指向修改後的向量迭代器,就繼續循環,再與end()比較時斷言出現。 解決方法是將「vector.erase(i);」替換爲「i = vector.erase(i);」,這是由於STL裏的全部容器類中的erase實現都會返回一個迭代器,這個迭代器指向了「當前刪除元素的後繼元素,或是end()」。it
Three:將容器以參數的的形式,而且與實參相比較,應該用實參的引用,由於對於引用時實參的一個別名,是同一個變量,而已參數傳遞的是實參的副本,詳情能夠參考(c++ primer 關於引用章節,能夠深刻體會),這樣作也能夠提升程序的效率,減小了構造/析構函數的開銷,這也是一種良好的編程習慣,曾經本身在此吃過苦頭!