map容器中所有元素都是键值对,key起到索引的作用,通过key可以很快定位到实际的值;所有元素根据key值自动排序,底层结构也是二叉树。

map容器不允许有相同的key值,multimap允许有相同的key值。

  1、构造与赋值

 1 void printMap(const map<int, int>&m){
 2     for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++){
 3         cout << "key = " << it->first << " " << "value = " << it->second << endl;
 4     }
 5 }
 6 void test01(){
 7     map<int, int>m;//默认构造
 8     m.insert(pair<int, int>(2, 20));
 9     m.insert(pair<int, int>(1, 10));
10     m.insert(pair<int, int>(4, 40));
11     m.insert(pair<int, int>(3, 40));
12     printMap(m);
13 //key = 1 value = 10
14 //key = 2 value = 20
15 //key = 3 value = 40
16 //key = 4 value = 40
17     //拷贝构造
18     map<int, int>m1(m);
19     printMap(m1);
20     map<int, int>m2;
21        //赋值
22     m2 = m1;
23     printMap(m2);
24 }

  2、大小和互换

 1 map<int int> m1;
 2 map<int int> m2;
 3 m1.insert(make_pair(1,20));
 4 m2.insert(make_pair(1,10));
 5 //容器的大小
 6 m1.size();
 7 //是否为空
 8 m1.empty();
 9 //交换
10 m1.swap(m2);

  3、删除和插入

 1     map<int, int>m;
 2     //第一种插入方法
 3     m.insert(pair<int, int>(1, 10));
 4     m.insert(pair<int, int>(2, 20));
 5     //第二种
 6     m.insert(make_pair(3, 30));
 7     m.insert(make_pair(4, 40));
 8     printMap(m);
 9     //删除第一对
10     m.erase(m.begin());
11     m.erase(3);//按key值删除
12     m.clear();
13     //m.erase(m.begin(), m.end());
14     printMap(m);

  4、查找和统计

 1 void test05()
 2 {
 3     map<int, string> m;
 4     m.insert(make_pair(1, "Jenny"));
 5     m.insert(make_pair(2, "LiMing"));
 6     m.insert(make_pair(3, "Denny"));
 7 
 8     //查找
 9     map<int, string>::iterator pos = m.find(3);
10     if (pos != m.end())
11     {
12         cout << "key =" << (*pos).first << "value=" << (*pos).second << endl;
13     }
14     else
15     {
16         cout << "没有找到" << endl;
17     }
18     //统计 map容器不允许插入相同元素,值只能是0或者1
19     int num = m.count(3);
20 }

  5、改变map排序算法

 1 //仿函数
 2 class mycompare{
 3 public:
 4     bool operator()(int v1,int v2){
 5         return v1 > v2;
 6     }
 7 };
 8 
 9 void test02(){
10     map<int, int ,mycompare>m;
11     m.insert(make_pair(1, 20));
12     m.insert(pair<int, int >(2, 10));
13     m.insert(make_pair(3, 30));
14     for (map<int, int, mycompare>::iterator it = m.begin(); it != m.end(); it++){
15         cout << it->first << " " << it->second << endl;
16 
17     }
18 //3 30
19 //2 10
20 //1 20
21 }