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;
}