1. map 容器基本概念
map 中所有元素都是 pair
pair 中第一個元素為 key (鍵值) 起到索引運用? 第二個元素為 value(實值)
所有元素都會根據元素的鍵值自動排序
本質:
??map/multimap 屬于關聯式容器? 底層結構是用二叉樹實現
優點:
? 可以根據 key 值快速找到 value 值
map 和 multimap 的區別:
??map 中不允許有重復的key值
? multimap?中允許有重復的key值
2. map 構造和賦值
功能描述:
對 map 容器進行構造和賦值操作
map 容器中所有數據都是成對出現的? 插入時要使用對組
代碼示例
#include<iostream>
using namespace std;
#include<string>
#include<map>//set 容器排序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;m.insert(pair<int, int>(3, 30));m.insert(pair<int, int>(4, 40));m.insert(pair<int, int>(1, 10));m.insert(pair<int, int>(2, 20));printMap(m); //按照 key 值自動排序//拷貝構造map<int, int>m2(m);printMap(m2);//賦值map<int, int>m3;m3 = m2;printMap(m3);
}int main()
{test01();system("pause");return 0;
}
3. map 大小和交換
功能描述:
統計 map 容器大小以及交換 map 容器
代碼示例
#include<iostream>
using namespace std;
#include<string>
#include<map>//set 容器排序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>(3, 30));m.insert(pair<int, int>(4, 40));m.insert(pair<int, int>(1, 10));m.insert(pair<int, int>(2, 20));if (m.empty()){cout << "m 為空" << endl;}else{cout << "m 不為空" << endl;;cout << "m 的大小為:" << m.size() << endl; //4}}void test02()
{map<int, int> m1;m1.insert(pair<int, int>(3, 30));m1.insert(pair<int, int>(4, 40));m1.insert(pair<int, int>(1, 10));m1.insert(pair<int, int>(2, 20));map<int, int> m2;m2.insert(pair<int, int>(5, 50));m2.insert(pair<int, int>(6, 60));m2.insert(pair<int, int>(7, 70));m2.insert(pair<int, int>(8, 80));cout << "交換前" << endl;printMap(m1);printMap(m2);m1.swap(m2);cout << "交換后" << endl;printMap(m1);printMap(m2);
}int main()
{test01();test02();system("pause");return 0;
}
4. map 插入和刪除
功能描述:
map 容器進行數據的插入和刪除操作
代碼示例
#include<iostream>
using namespace std;
#include<string>
#include<map>//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(make_pair(2, 20));//第三種m.insert(map<int, int>::value_type(3, 30));//第四種m[4] = 40;//[]不建議插入 但可以利用key訪問到value//cout<<map[4]<<endl;printMap(m);//刪除m.erase(m.begin());printMap(m);m.erase(3); //按照 key 刪除printMap(m);m.erase(m.begin(), m.end());printMap(m);m.clear();printMap(m);
}int main()
{test01();system("pause");return 0;
}
5. map 查找和統計
功能描述:
對 map 容器進行查找和統計操作
查找? --? find()? 返回的是一個迭代器
統計? --? count()? 對于map容器? 結果為0或1
代碼示例
#include<iostream>
using namespace std;
#include<string>
#include<map>//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>(2, 20));m.insert(pair<int, int>(3, 30));m.insert(pair<int, int>(4, 40));map<int, int>::iterator pos = m.find(3);if (pos != m.end()){cout << "找到了元素:" << pos->first << " value = " << pos->second << endl;}else {cout << "沒有找到" << endl;}//統計int num = m.count(3); //map 不允許插入重復key元素,所以統計結果只有0或1cout << "num = " << num << endl; //1
}int main()
{test01();system("pause");return 0;
}
6. map 容器排序
功能描述:
對 map 容器中的元素進行排序
利用仿函數可以指定 map 容器的排序規則
對于自定義數據類型? map 容器必須指定排序規則
代碼示例
#include<iostream>
using namespace std;
#include<string>
#include<map>//map 容器插入和刪除class MyCompare
{
public:bool operator()(int v1, int v2) const{//降序return v1 > v2;}
};void test01()
{map<int, int,MyCompare> m;m.insert(make_pair(1, 10));m.insert(make_pair(2, 20));m.insert(make_pair(3, 30));m.insert(make_pair(4, 40));m.insert(make_pair(5, 50));for (map<int, int,MyCompare>::iterator it = m.begin();it != m.end();it++){cout << "key = " << it->first << " value = " << it->second << endl;}cout << endl;
}int main()
{test01();system("pause");return 0;
}