==================================聲明==================================
本文版權歸作者所有。
本文原創,轉載必須在正文中顯要地注明作者和出處,並保證文章(包括本聲明)的完整性。
未經作者授權請勿修改(包括本聲明),保留法律追究的權利。
未經作者授權請勿用於學術性引用。
未經作者授權請勿用於商業出版、商業印刷、商業引用以及其他商業用途。
本文不定期修正完善,為保證內容正確,建議移步原文處閱讀。
本文鏈接:http://www.cnblogs.com/wlsandwho/p/4468023.html
=======================================================================
STL是個好東西,在客戶端上用一用沒什麼問題。
在使用multimap時,伴隨一個set來統計multimap中key的種類。真是省心省力。
然而,時間換空間、空間換時間。伴隨set會帶來開銷。
世間安得雙全法?那必定是晦澀難懂的,不能在普羅大眾間流傳。
=======================================================================
以前一直沒怎麼注意遍歷刪除set。當我隨手寫了個小代碼後,我想知道人類是怎麼做的。
於是搜一搜。
不知為何,網上真是轉載文章一大抄,這也罷了,可為何STL遍歷刪除的例子都要列上錯誤做法?
=======================================================================
set的erase並不返回iterator,所以在遍歷刪除的時候,要使用
void erase (iterator position);
函數。
一個不錯的小網站http://www.cplusplus.com/reference/
=======================================================================
貼上我的純手工小代碼。
1 #include <iostream> 2 #include <set> 3 4 using namespace std; 5 6 int main() 7 { 8 set<int> setIntTest; 9 set<int>::iterator itsetIntTest; 10 11 setIntTest.insert(1); 12 setIntTest.insert(2); 13 setIntTest.insert(3); 14 setIntTest.insert(4); 15 setIntTest.insert(5); 16 setIntTest.insert(6); 17 setIntTest.insert(7); 18 19 wcout<<L"Before:"<<endl; 20 for (itsetIntTest=setIntTest.begin();itsetIntTest!=setIntTest.end();itsetIntTest++) 21 { 22 wcout<<*itsetIntTest<<endl; 23 } 24 25 ////////////////////////////////////////////////////////////////////////// 26 wcout<<L"Remove those can not be divided by 3:"<<endl; 27 for (itsetIntTest=setIntTest.begin();itsetIntTest!=setIntTest.end();) 28 { 29 if ((*itsetIntTest)%3!=0) 30 { 31 wcout<<L"Remove\t"<<*itsetIntTest<<endl; 32 33 setIntTest.erase(itsetIntTest++);//必然是擦除後再移動迭代器,所以後++ 34 } 35 else 36 { 37 itsetIntTest++;//這個就無所謂前後了,沒有涉及增刪操作。 38 } 39 } 40 41 ////////////////////////////////////////////////////////////////////////// 42 wcout<<L"After:"<<endl; 43 for (itsetIntTest=setIntTest.begin();itsetIntTest!=setIntTest.end();itsetIntTest++) 44 { 45 wcout<<*itsetIntTest<<endl; 46 } 47 48 return 0; 49 }