C++学习 --- STL常用容器之map容器
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> using namespace 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; }