迭代器失效

STL容器迭代器存在失效的狀況,須要瞭解STL容器的實現方式,才能理解那種迭代器在何種狀況下會失效。spa

  • Vector,Vector迭代器的實質是指針,而vector空間是連續的,在分配空間的時候,vector實際分配的空間通常會大於所需的空間,能夠經過capacity來得到vector實際分配的空間大小,經過size得到實際使用的空間大小。當vector增長成員,致使成員數大於capacity的時候,vector會從新申請內存,並將原來的成員挨個copy到新存儲空間。而這個行爲會致使指向原空間的迭代器失效。
  • list, slist, (multi)set, (multi)map,因爲不是順序存儲,因此迭代器和vector存在區別,insert和splice都不會形成原有的迭代器失效。而erase操做,會使指向被刪除的那個元素的迭代器失效,其餘迭代器不會受到影響。
  • 關於刪除元素致使被刪除的迭代器失效的例子:
  • std::vector<std::int> iter = m_vResult.begin();
        for(; iter !=m_vResult.end(); iter++){
            if(*iter == 0){
                m_vResult.erase(iter); //iter被刪除後就失效了。iter++動做是未定義
            }
        }

    正確寫法以下指針

    std::vector<std::int> iter = m_vResult.begin();
        while(iter !=m_vResult.end()){
            if(*iter == 0){
                m_vResult.erase(iter++); 
            }
            else{
                iter++;
            }
        }    
    

    或者code

    std::vector<std::int> iter = m_vResult.begin();
        while(iter !=m_vResult.end()){
            if(*iter == 0){
                iter = m_vResult.erase(iter); 
            }
            else{
                iter++;
            }
        }    
相關文章
相關標籤/搜索