==================================聲明==================================
本文版權歸作者所有。
本文原創,轉載必須在正文中顯要地注明作者和出處,並保證文章(包括本聲明)的完整性。
未經作者授權請勿修改(包括本聲明),保留法律追究的權利。
未經作者授權請勿用於學術性引用。
未經作者授權請勿用於商業出版、商業印刷、商業引用以及其他商業用途。
本文不定期修正完善,為保證內容正確,建議移步原文處閱讀。
本文鏈接: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 }