【解決方法一】C++ map解決
一、map中的find函數:
用於查找map中是否包含某個關鍵字條目,傳入的參數是要查找的key,最后返回一個迭代器,如果沒有找到,則返回的迭代器等於end()返回的迭代器。示例代碼:
1 #include<iostream> 2 #include<string> 3 #include<map> 4 using namespace std; 5 6 int main() { 7 map<int, string> mapStudent; 8 9 mapStudent.insert(pair<int, string>(1, "student_one")); 10 mapStudent.insert(pair<int, string>(2, "student_two")); 11 mapStudent.insert(pair<int, string>(3, "student_three")); 12 13 map<int, string>::iterator iter; 14 iter = mapStudent.find(3); 15 if (iter != mapStudent.end()) 16 cout << "Find,the value is: " << iter->second << endl; 17 system("pause"); 18 return 0; 19 }
運行結果:
二、map的插入方法:
插入的方法有好幾種,下面介紹:map.insert(pair<type1,type2>(key,value))這種,還有一種是map[key] = value,前者出現重復不會發生改變,后者出現重復則會發生覆蓋,后者如果沒有給value值,直接使用map[key],則其value值默認為0。示例代碼:
1 #include<iostream> 2 #include<string> 3 #include<map> 4 using namespace std; 5 6 int main() { 7 8 map<int, string> mapStudent; 9 mapStudent.insert(pair<int, string>(1, "student_one")); 10 mapStudent.insert(pair<int, string>(2, "student_two")); 11 mapStudent.insert(pair<int, string>(2, "xxooxxooxxo"));//不起作用 12 13 map<int, string>::iterator iter; 14 for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++) { 15 cout << iter->first << ' ' << iter->second << endl; 16 } 17 cout << endl; 18 mapStudent[2] = "xxooxxooxxoo";//覆蓋掉前面的value 19 for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++) { 20 cout << iter->first << ' ' << iter->second << endl; 21 } 22 system("pause"); 23 return 0; 24 }
運行結果:
三、是否插入成功?
我們通過pair來獲取是否插入成功,pair返回兩個變量,第一個是map的迭代器,第二個是插入成功的標志,插入成功pair的第二個參數是true,插入失敗,第二個參數為false。實例代碼:
1 pair<map<type1,type2>::iterator,bool> ret; 2 3 ret = map_s.insert(pair<type1,type2>(key,value)) 4 5 if(ret.second==ture) 6 7 cout<<"插入成功"<<endl; 8 else 9 cout<<"插入失敗"<<endl;
四、統計字符出現個數:
思路1:先創建一個map,遍歷字符串,逐個判斷如果存在則count++,不存在則創建一個,讓其value為1
思路2:通過插入失敗來增加字符的個數,如果插入失敗則表明map中存在該字符,count++即可
思路3:需要對map了解,直接使用庫里提供的[]運算符重載。通過鍵值找節點,直接給給實值+1.
思路1:先創建一個map,遍歷字符串,逐個判斷如果存在則count++,不存在則創建一個,讓其value為1。代碼如下:
1 #include<iostream> 2 #include<string> 3 #include<map> 4 using namespace std; 5 6 // 方法1: 7 int main() 8 { 9 map<char, int> map_s; 10 string str = "kkk ahguird-j l"; 11 12 for (int i = 0; i < str.length(); ++i) 13 { 14 map<char, int>::iterator iter = map_s.find(str[i]); 15 if (iter != map_s.end()) 16 { 17 iter->second++; 18 } 19 else // 如果找不到就添加一個,找到了就count++ 20 { 21 map_s.insert(pair<char, int>(str[i], 1)); // 如果測試用例為 "qwerqwer"時,前4次循環都是執行的這句else即insert插入操作 22 } 23 } 24 map<char, int>::iterator iter = map_s.begin(); 25 26 for (; iter != map_s.end(); iter++) 27 { 28 cout << iter->first << ' ' << iter->second << endl; 29 } 30 cout << endl; 31 32 system("pause"); 33 return 0; 34 }
運行結果:
思路2:通過插入失敗來增加字符的個數,如果插入失敗則表明map中存在該字符,count++即可。代碼如下:
1 #include<iostream> 2 #include<string> 3 #include<map> 4 using namespace std; 5 6 int main() 7 { 8 map<char, int> map_s; 9 string str = "kkk ahguird-j l"; 10 11 pair<map<char, int>::iterator, bool> ret; 12 for (int i = 0; i < str.length(); ++i) 13 { 14 ret = map_s.insert(pair<char, int>(str[i], 1)); 15 if (ret.second == false) // 如果插入失敗,則該迭代器的第一個參數的value++ 16 { 17 ret.first->second++; 18 } 19 } 20 map<char, int>::iterator iter = map_s.begin(); 21 for (; iter != map_s.end(); iter++) 22 { 23 cout << iter->first << ' ' << iter->second << endl; 24 } 25 cout << endl; 26 27 system("pause"); 28 return 0; 29 }
運行結果:
思路3:直接使用庫里提供的[]運算符重載。通過鍵值找節點,直接給給實值+1.
1 #include<iostream> 2 #include<string> 3 #include<map> 4 using namespace std; 5 6 int main() { 7 string str; 8 map<char, int> map_s; 9 while (cin >> str) { 10 for (int i = 0; i < str.length(); ++i) { 11 map_s[str[i]]++; 12 } 13 map<char, int>::iterator iter; 14 for (iter = map_s.begin(); iter != map_s.end(); ++iter) { 15 cout << iter->first << ':' << iter->second << endl; 16 } 17 } 18 }
思路3是真的6阿~
參考連接:https://blog.csdn.net/qq_34312386/article/details/55281662
對思路3補充說明:假設一個map對象map_s中只存在一對pair<char,int>('a',1),現在執行map_s['b']則map_s中存在兩對pair分別是('a',1),('b',0),是的,沒錯,'b'的value默認是0,那么如果剛才執行的不是map_s['b'],而是map_s['b']++,那么map_s中的兩對pair為('a',1)和('b',1),理解為插入‘b’,然后value值++,所以,map_s['b']++這個語句的理解如下:
如果map_s中不存在key為‘b’的元素,那么在map_s中添加‘b’,value默認為0,然后map_s['b']++,value變成1.
如果map_s中存在key為 'b' 的元素,那么該語句表示map_s['b']的value++.
1 #include<iostream> 2 #include<map> 3 using namespace std; 4 5 int main() { 6 map<char, int> m; 7 m.insert(pair<char, int>('a', 1)); 8 map<char, int>::iterator iter = m.begin(); 9 cout << iter->first << ' '<<iter->second<<endl; 10 m['b']; 11 iter++; 12 cout << iter->first << ' ' << iter->second << endl;//value默認是0 13 m['b']++; 14 cout << iter->first << ' ' << iter->second << endl;//將value++ 15 while (1); 16 }