C++進階-3-6-map/multimap容器 1 #include<iostream> 2 #include<map> 3 using namespace std; 4 5 // map / multimap容器 6 7 void printMap(map<int, int>& m) { 8 f ...
C++進階-3-6-map/multimap容器
1 #include<iostream> 2 #include<map> 3 using namespace std; 4 5 // map / multimap容器 6 7 void printMap(map<int, int>& m) { 8 for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) { 9 cout << "key = " << (*it).first << " value = " << it->second << endl; 10 } 11 cout << endl; 12 } 13 14 // 1.構造和賦值 15 void test01() { 16 17 // 創建map容器 18 map<int, int> m; 19 20 m.insert(pair<int, int>(1, 10)); 21 m.insert(pair<int, int>(2, 20)); 22 m.insert(pair<int, int>(3, 30)); 23 m.insert(pair<int, int>(4, 40)); 24 25 printMap(m); 26 27 // 拷貝構造 28 map<int, int>m2(m); 29 printMap(m2); 30 31 // 賦值 32 map<int, int>m3; 33 m3 = m2; 34 printMap(m3); 35 36 } 37 38 // 2.大小和交換 39 void test02() { 40 41 map<int, int> m; 42 43 m.insert(pair<int, int>(1, 10)); 44 m.insert(pair<int, int>(2, 20)); 45 m.insert(pair<int, int>(3, 30)); 46 m.insert(pair<int, int>(4, 40)); 47 48 //printMap(m); 49 50 // 大小 51 if (m.empty()) { 52 cout << "m 為空" << endl; 53 } 54 else 55 { 56 cout << "m 不為空" << endl; 57 cout << "m 的大小為:" << m.size() << endl; 58 } 59 60 // 交換 61 map<int, int> m2; 62 63 m2.insert(pair<int, int>(5, 50)); 64 m2.insert(pair<int, int>(6, 60)); 65 m2.insert(pair<int, int>(7, 70)); 66 m2.insert(pair<int, int>(8, 80)); 67 68 cout << "交換前:" << endl; 69 printMap(m); 70 printMap(m2); 71 72 cout << "交換後:" << endl; 73 m.swap(m2); 74 printMap(m); 75 printMap(m2); 76 } 77 78 // 3.插入和刪除 79 void test03() { 80 81 map<int, int> m; 82 83 // 插入 84 // 第一種 85 m.insert(pair<int, int>(1, 10)); 86 printMap(m); 87 88 // 第二種 89 m.insert(make_pair(2, 20)); 90 printMap(m); 91 92 // 第三種 93 m.insert(map<int, int>::value_type(3, 30)); 94 printMap(m); 95 96 // 第四種 97 m[4] = 40; // 不建議插入使用 98 printMap(m); 99 100 101 // 刪除 102 m.erase(m.begin()); 103 printMap(m); 104 105 m.erase(3); // 按照key刪除 106 printMap(m); 107 108 // 清空 109 //m.erase(m.begin(), m.end()); 110 m.clear(); 111 printMap(m); 112 } 113 114 // 4.查找和統計 115 void test04() { 116 117 map<int, int> m; 118 119 m.insert(pair<int, int>(1, 10)); 120 m.insert(pair<int, int>(2, 20)); 121 m.insert(pair<int, int>(3, 30)); 122 m.insert(pair<int, int>(4, 40)); 123 124 printMap(m); 125 126 // 查找,find返回的是迭代器 127 map<int, int>::iterator pos = m.find(3); 128 129 if (pos != m.end()) { 130 cout << "查到了元素,key = " << (*pos).first << " value = " << pos->second << endl; 131 } 132 else 133 { 134 cout << "未找到元素" << endl; 135 } 136 137 // 統計, map中無重覆的key,所以,統計值為0或1 138 // multimap的count統計可能大於1 139 int num = m.count(1); 140 cout << "num = " << num << endl; 141 142 } 143 144 // 5. 排序 145 146 class MyCompare { 147 public: 148 bool operator()(int v1, int v2) { 149 // 降序 150 return v1 > v2; 151 } 152 153 }; 154 155 void printMap1(map<int, int, MyCompare>& m) { 156 for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) { 157 cout << "key = " << (*it).first << " value = " << it->second << endl; 158 } 159 cout << endl; 160 } 161 162 void test05() { 163 164 map<int, int> m; 165 166 m.insert(pair<int, int>(1, 10)); 167 m.insert(pair<int, int>(2, 20)); 168 m.insert(pair<int, int>(3, 30)); 169 m.insert(pair<int, int>(4, 40)); 170 171 // 排序 預設:從小到大,升序 172 printMap(m); 173 174 // 降序 175 map<int, int, MyCompare> m2; 176 177 m2.insert(pair<int, int>(1, 10)); 178 m2.insert(pair<int, int>(2, 20)); 179 m2.insert(pair<int, int>(3, 30)); 180 m2.insert(pair<int, int>(4, 40)); 181 182 printMap1(m2); 183 184 } 185 186 int main() { 187 188 // 1.構造和賦值 189 //test01(); 190 191 // 2.大小和交換 192 //test02(); 193 194 // 3.插入和刪除 195 //test03(); 196 197 // 4.查找和統計 198 //test04(); 199 200 // 5. 排序,預設,從小到大升序 201 test05(); 202 203 system("pause"); 204 205 return 0; 206 } 207 208 // 總結 209 // 210 // map / multimap容器 211 // 212 // 簡介: 213 // map中所有元素都是pair 214 // pair中第一個元素為key,起索引作用,第二個元素為value 215 // 所有元素都回根據元素的鍵值自動排序 216 // 217 // 本質:屬於關聯式容器,地層結構用二叉樹實現 218 // 219 // 優點:可以根據key值快速找到value值 220 // 221 // map / multimap區別: 222 // map不允許容器中有重覆的key 223 // multi允許容器中有重覆的key 224 //