C++ vector erase函數的使用注意事項


最近使用了順序容器的刪除元素操作,特此記錄下該函數的注意事項。

在C++primer中對c.erase(p) 這樣解釋的:

        c.erase(p)    刪除迭代器p所指向的元素,返回一個指向被刪元素之后元素的迭代器,若p指向尾元素,則返回尾后迭代器,若p是尾后迭代器,則會產生未定義行為。

    這個函數我在使用的過程中發現有那么一點小小的注意事項

如果要想遍歷一個容器,並且刪除某個不符合要求的元素,那么最好使用while而不是使用for

因為

    vector<RotatedRect>::iterator  it = m_rect.begin();
        while((it) != m_rect.end()){
            float diff = abs((*it).size.width - (*(it + 1)).size.width);
           if( diff > diffmax){
               if(( it - m_rect.begin())  < (m_rect.size() / 2))   it = m_rect.erase(it); //此時指針已經指向下一個元素,故指針不需要再自增 else   it = m_rect.erase(it + 1); 
           }else{
               it++; //否則指針自增一,while循環可以選擇有條件的讓指針指向下一個元素
           }
        }    
    vector<RotatedRect>::iterator  it = m_rect.begin();
        for( ;(it) != m_rect.end(); it++ ) //如果使用for循環,並且選擇在此處自增一
{ float diff = abs((*it).size.width - (*(it + 1)).size.width); if( diff > diffmax){ if(( it - m_rect.begin()) < (m_rect.size() / 2)) it = m_rect.erase(it); //那么將會與這里的自增重復,這樣會造成有元素被跳過 else it = m_rect.erase(it + 1); } }

我在查閱資料時發現有個博主推薦的寫法是這樣的

此處鏈接http://blog.csdn.net/zhuimengzh/article/details/6841500

void fun()

{

    vector<int> iVec;

    vector<int>::iterator it;

    for(int i=0;i<10;i++)

        iVec.push_back(i);

    display(iVec);

    for(it=iVec.begin();it!=iVec.end();++it)

    {

        if(*it ==4 || *it == 7)

        {

            it=iVec.erase(it);

                        --it;//這里回退一個       //******該博主推薦在此處自動回退一個,這樣貌似可以用for循環了,但是其實不是的

        }

    }

    display(iVec);

}

如果你刪除的元素是容器的第一個元素,那么回退的行為將是未定義的,切記

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM