C++學習 --- STL常用容器之map容器
阿新 • • 發佈:2021-10-20
8、map/multimap 容器
8.1、map基本概念
簡介:
-
map中所有元素都是pair
-
pair中第一個元素為key(鍵值),起到索引作用,第二個元素為value(實值)
-
所有元素都會根據元素的鍵值自動排序
本質:
-
map/multimap屬於關聯式容器,底層結構是用二叉樹實現。
優點:
-
可以根據key值快速找到value值
map和multimap的區別:
-
map不允許容器中有重複key值元素
-
multimap允許容器中有重複key值元素
8.2、map構造和賦值
#include <iostream> #include <map> usingnamespace std; /* map<T1,T2> mp; //map預設建構函式 map(const map &mp); //拷貝建構函式 map& operator=(const map & mp); //過載等號操作符 */ //map容器 構造和賦值 void printMap(map<int, int> &m) { for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) { cout << "key =" << (*it).first << " value = " << it->second << endl; } cout << endl; } void test01() { //建立map容器,預設構造 map<int, int> m; //匿名對組放入容器中,預設按照key排序 m.insert(pair<int,int>(1,10)); m.insert(pair<int,int>(6,60)); m.insert(pair<int,int>(3,30)); m.insert(pair<int,int>(4,40)); printMap(m); //拷貝構造 map<int, int> m2(m); printMap(m2); //賦值 map<int, int> m3; m3 = m2; printMap(m3); } int main() { test01(); system("pause"); return 0; }
8.3、map大小和交換
#include <iostream> #include <map> using namespace std; /* size(); //返回容器中元素的數目 empty(); //判斷容器是否為空 swap(st); //交換兩個集合容器 */ //map容器的大小和交換 void printMap(map<int, int> &m) { for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) { cout << "key:" << it->first << " value:" << it->second << endl; } cout << endl; } void test01() { map<int, int> m; m.insert(pair<int,int>(1,10)); m.insert(pair<int,int>(6,60)); m.insert(pair<int,int>(3,30)); m.insert(pair<int,int>(4,40)); if (m.empty()) { cout << "m為空" << endl; } else { cout << "m不為空" << endl; } cout << "m的大小:" << m.size() << endl; } //交換 void test02() { map<int, int> m1; m1.insert(pair<int,int>(1,10)); m1.insert(pair<int,int>(2,20)); m1.insert(pair<int,int>(3,30)); map<int, int> m2; m2.insert(pair<int, int>(5, 500)); m2.insert(pair<int, int>(6, 600)); cout << "交換前:" << endl; printMap(m1); printMap(m2); m1.swap(m2); cout << "交換後:" << endl; printMap(m1); printMap(m2); } int main() { test01(); test02(); system("pause"); return 0; }
8.4、map插入和刪除
#include <iostream> #include <map> using namespace std; /* insert(elem); //在容器中插入元素 clear(); //清除所有元素 erase(pos); //刪除pos迭代器所指的元素,返回下一個元素的迭代器 erase(beg,end);//刪除區間[beg,end]的所有元素,返回下一個元素的迭代器 erase(key); //刪除容器中值為key的元素 */ //map容器的插入和刪除 void printMap(map<int, int> &m) { for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) { cout << "key:" << it->first << " value:" << it->second << endl; } cout << endl; } void test01() { map<int, int> m; //第一種 m.insert(pair<int,int>(1,10)); m.insert(pair<int,int>(6,60)); //第二種 m.insert(make_pair(2,20)); //第三種 m.insert(map<int,int>::value_type(3,30)); //第四種,不建議使用[]插入 m[5] = 40; //利用key有值的情況進行值的訪問; //否則在key沒有值的情況下,預設給值賦值為0,訪問得到0 cout << m[2] << endl; printMap(m); //刪除 m.erase(m.begin()); printMap(m); //按照key刪除,有則刪除 m.erase(3); printMap(m); //按照區間的方式刪除,相當於清空 //m.erase(m.begin(),m.end()); m.clear(); printMap(m); } int main() { test01(); system("pause"); return 0; }
8.5、map查詢和統計
函式原型:
-
find(key); //查詢key是否存在,若存在,返回該鍵的元素的迭代器;若不存在,返回map.end();
-
count(key);//統計key的元素個數
#include <iostream> #include <map> using namespace std; /* find(key); //查詢key是否存在,若存在,返回該鍵的元素的迭代器;若不存在,返回map.end(); count(key);//統計key的元素個數 */ //map容器的查詢和統計 void test01() { map<int, int> m; m.insert(pair<int,int>(1,10)); m.insert(pair<int,int>(4,40)); //map不允許插入重複的key m.insert(pair<int,int>(4,30)); m.insert(pair<int,int>(2,20)); map<int,int>::iterator pos = m.find(4); if (pos != m.end()) { cout << "查詢到了元素 key=" << pos->first << " value=" << pos->second << endl; } else { cout << "未找到元素" << endl; } //統計,cout統計而言count統計而言,結果要麼是 0,要麼是1. //mutimap可以大於1 int num = m.count(4); cout << "num = " << num << endl; } int main() { test01(); system("pause"); return 0; }
8.6、map容器排序
利用仿函式可以改變排序規則
#include <iostream> #include <map> using namespace std; /* map容器預設排序規則為按照key值進行從小到大排序 利用仿函式可以改變排序規則,即過載了函式呼叫小括號 */ class MyCompare { public: bool operator()(int v1, int v2){ //降序 return v1 > v2; } }; void printMap(map<int, int, MyCompare> &m) { for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) { cout << "key:" << it->first << " value:" << it->second << endl; } cout << endl; } //map容器的排序 void test01() { //指定仿函式 map<int, int, MyCompare> m; m.insert(pair<int,int>(1,10)); m.insert(make_pair(2,20)); m.insert(make_pair(5,50)); m.insert(make_pair(3,30)); printMap(m); } int main() { test01(); system("pause"); return 0; }