關於list iterators incompatible/vector iterators incompatible 報錯總結

      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 關於引用章節,能夠深刻體會),這樣作也能夠提升程序的效率,減小了構造/析構函數的開銷,這也是一種良好的編程習慣,曾經本身在此吃過苦頭!




相關文章
相關標籤/搜索