vector、map容器刪除操作總結

來源:互聯網
上載者:User

 

 1、關於vector中元素的刪除和迭代器失效問題

vector<int> vv;<br />vv.push_back(1);//加入第一個元素<br />vector<int>::iterator itBegin = vv.begin();//擷取第一個元素迭代器*itBegin=1<br />vv.push_back(2);//因為預留不夠,所以發生記憶體搬移,之前迭代器將全部失效<br />vv.push_back(1);//即是說itBegin現在已經是個無效迭代器<br />vv.push_back(1);//所以使用vector迭代器一定要小心失效!<br />vv.push_back(3);//移動、增加、插入、刪除以及reserve、resize都可能使迭代器無效!<br />vv.push_back(4);<br />vv.push_back(3);<br />vv.push_back(5);<br />vv.push_back(6);<br />int n = vv.size();//n = 9</p><p>vector<int>::iterator itrmv = remove(vv.begin(), vv.end(), 3);//結果:1,2,1,1,4,5,6,5,6<br />n = vv.size();//n = 9</p><p>//刪除vector中等於某值的所有元素<br />//remove演算法只是對容器中有效元素向前移動覆蓋無效元素,返回第一個無效元素指標<br />//1、它不會有刪除動作 2、尾部無效元素沒有意義 3、之後容器size不變</p><p>vv.erase(itrmv, vv.end());//結果:1,2,1,1,4,5,6<br />n = vv.size();//n = 7</p><p>bool BeDelete(int n)<br />{<br />return n == 1 || n == 2;<br />}</p><p>//藉助remove_if演算法刪除vecotr中符合某些條件的所有元素</p><p>vv.erase(remove_if(vv.begin(), vv.end(), BeDelete), vv.end());//結果:4,5,6<br />n = vv.size();//n = 3</p><p>//若用迴圈實現刪除,需要注意erase後迭代器失效問題<br />for(vector<int>::iterator it=vv.begin(); it!=vv.end(); )<br />{<br />if(*it == 4)<br />{<br />/*錯誤的做法<br />vv.erase(it);//對vector進行增加刪除等操作後之前it可能無效<br />it++;//it此時已經無效<br />*/<br />/*錯誤的做法<br />vv.erase(it++);//erase後元素髮生了移動所以it多向後跳過一個元素<br />*/<br />it = vv.erase(it);//正確的做法,erase返回下一個有效it<br />}<br />else<br />{<br />it++;<br />}<br />}</p><p>n = vv.size();//n=2,結果:5,6  

 

2、釋放vector容器多餘的記憶體

vector<int> vn;<br />vn.reserve(10);//預留10個元素空間<br />int nn = vn.capacity();//nn = 10</p><p>vn.push_back(1);<br />vn.push_back(2);<br />nn = vn.capacity();//nn = 10</p><p>vector<int>(vn).swap(vn);//通過建立一個新對象釋放多餘空間<br />nn = vn.capacity();//nn = 2<br />nn = vn.size();//nn = 2</p><p>vector<int>().swap(vn);//會完全清空容器,釋放所有空間

 

3、map中刪除滿足某些條件的元素

 

map<int, int> mm;<br />mm.insert(make_pair(1,1));<br />mm.insert(make_pair(2,2));<br />mm.insert(make_pair(3,1));<br />mm.insert(make_pair(4,3));<br />mm.insert(make_pair(5,3));<br />mm.insert(make_pair(6,6));</p><p>//注意:對map和set等自動排序的容器不應使用remove一類演算法<br />//應使用for+erase或者while+find_if+erase</p><p>//第一種方法for+erase<br />map<int, int>::iterator mit;</p><p>for(mit = mm.begin(); mit != mm.end();)<br />{<br />if(mit->second == 1)<br />{<br />mm.erase(mit++);//這裡需要注意<br />}<br />else<br />{<br />mit++;<br />}<br />}</p><p>//第二種方法,while+find_if+erase</p><p>//僅以元素做條件檢索<br />bool mBeDelete(const pair<int, int>& val)<br />{<br />return val.second == 1;<br />}</p><p>mit = find_if(mm.begin(), mm.end(), mBeDelete);<br />while(mit != mm.end())<br />{<br />mit = find_if(mm.erase(mit), mm.end(), mBeDelete);<br />}</p><p>//除元素外還需要傳入另外一個條件參數</p><p>//這裡的參數無法使用常量引用<br />bool mBeDelete2(pair<int, int> val, int n)<br />{<br />return val.second == n;<br />}</p><p>mit = find_if(mm.begin(), mm.end(), bind2nd(ptr_fun(mBeDelete2),3));<br />while(mit != mm.end())<br />{<br />mit = find_if(mm.erase(mit), mm.end(), bind2nd(ptr_fun(mBeDelete2),3));<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.