map容器

一.摘要

简介:

  • map中所有元素都是pair
  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
  • 所有元素都会根据元素的键值自动排序(按key排序)

本质:

  • map/multimap属于关联式容器,底层结构是用二叉树实现。

优点:

  • 可以根据key值快速找到value值

map和multimap区别

  • map不允许容器中有重复key值元素
  • multimap允许容器中有重复key值元素

二.构造和赋值

函数原型:

map<T1, T2> mp; 
//map默认构造函数: map(const map &mp); //拷贝构造函数

示例代码:

复制代码
1 /*map容器的构造函数*/ 2 #include<iostream> 3 #include<ctime> 4 #include<map> 5 using namespace std; 6 void printMap(const map<int, int>&m) { 7 for (map<int, int>::const_iterator it = m.begin(); it!=m.end(); it++) { 8 cout << "key=" << (*it).first << "\tvalue=" << (*it).second << endl; 9 } 10 } 11 int main() { 12 srand((unsigned)time(NULL)); 13 map<int, int>m1; //map<T1, T2> mp; //map默认构造函数: 14 for (int i = 0; i < 5; i++) { 15 m1.insert(pair<int,int>(i, rand())); 16 } 17 cout << "m1:" << endl; 18 printMap(m1); 19 map<int, int>m2(m1); //map(const map &mp); //拷贝构造函数 20 cout << "m2:" << endl; 21 printMap(m2); 22 map<int, int>m3; 23 m3 = m1; 24 cout << "m3:" << endl; 25 printMap(m3); 26 system("pause"); 27 return 0; 28 }
map容器的构造和赋值
复制代码

运行结果:

三.大小和交换

函数原型:

size(); 
//返回容器中元素的数目 empty(); //判断容器是否为空 swap(st); //交换两个集合容器

示例代码:

复制代码
1 /*map容器的大小和交换*/ 2 #include<iostream> 3 #include<ctime> 4 #include<map> 5 using namespace std; 6 void printMap(const map<int, int>&m) { 7 for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) { 8 cout << "key=" << (*it).first << "\tvalue=" << (*it).second << endl; 9 } 10 } 11 int main() { 12 srand((unsigned)time(NULL)); 13 map<int, int>m1; 14 for (int i = 0; i < 10; i++) { 15 m1.insert(pair<int, int>(i, rand())); 16 } 17 if (m1.empty()) { //empty(); //判断容器是否为空 18 cout << "m1的大小为空!"; 19 } 20 else { 21 cout << "m1的大小为:" << m1.size() << endl; //size(); //返回容器中元素的数目 22 } 23 printMap(m1); 24 map<int, int>m2; 25 m2.insert(make_pair(8, 8)); 26 cout << "m2:" << endl; 27 printMap(m2); 28 m1.swap(m2); //swap(st); //交换两个集合容器 29 cout << "交换后:" << endl; 30 cout << "m1:" << endl; 31 printMap(m1); 32 cout << "m2:" << endl; 33 printMap(m2); 34 system("pause"); 35 return 0; 36 }
map容器的大小和交换
复制代码

运行结果:

 

四.插入和删除

函数原型:

insert(elem); 
//在容器中插入元素。 operator[]; //应该是返回value值 clear(); //清除所有元素 erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。 erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。 erase(key); //删除容器中值为key的元素。

示例代码:

复制代码
1 /*map容器的插入和删除*/ 2 #include<iostream> 3 #include<ctime> 4 #include<map> 5 using namespace std; 6 void printMap(const map<int, int>&m) { 7 for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) { 8 cout << "key=" << (*it).first << "\tvalue=" << (*it).second << endl; 9 } 10 } 11 int main() { 12 srand((unsigned)time(NULL)); 13 map<int, int>m1; 14 for (int i = 0; i < 5; i++) { 15 //key:0 2 4 6 8 16 m1.insert(pair<int, int>(i*2, rand())); //insert(elem); //在容器中插入元素。 17 } 18 printMap(m1); 19 cout << "在第3个位置插入元素“8”:" << endl; 20 m1[3] = 8; //operator[]; //应该是返回value值 21 printMap(m1); 22 cout << "删除第1个元素:" << endl; 23 m1.erase(m1.begin()); //erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。 24 printMap(m1); 25 cout << "删除第1到第2位置的元素:" << endl; 26 m1.erase(m1.begin(), ++(++m1.begin())); //erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。 27 printMap(m1); 28 cout << "删除容器中key为6的元素:" << endl; 29 m1.erase(6); //erase(key); //删除容器中值为key的元素。 30 printMap(m1); 31 cout << "清楚容器中的所有元素:" << endl; 32 m1.clear(); //clear(); //清除所有元素 33 printMap(m1); 34 system("pause"); 35 return 0; 36 }
map容器的插入和删除
复制代码

运行结果:

五.查找和统计

函数原型:

find(key); 
//查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end(); count(key); //统计key的元素个数

示例代码:

复制代码
1 /*map容器的查找和统计*/ 2 #include<iostream> 3 #include<map> 4 using namespace std; 5 void printMap(const map<int, int>&m) { 6 for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) { 7 cout << "key=" << (*it).first << "\tvalue=" << (*it).second << endl; 8 } 9 } 10 int main() { 11 map<int, int>m1; 12 m1.insert(pair<int, int>(1, 11)); 13 m1.insert(pair<int, int>(76, 33)); 14 m1.insert(pair<int, int>(45, 77)); 15 m1.insert(pair<int, int>(76, 66)); 16 m1.insert(pair<int, int>(3, 44)); 17 printMap(m1); 18 if (m1.find(45) != m1.end()) { //find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end(); 19 cout << "容器中存在key为“66”:" << endl; 20 } 21 else { 22 cout << "容器中不存在key为“66”:" << endl; 23 } 24 if (m1.find(88) != m1.end()) { 25 cout << "容器中存在key为“88”:" << endl; 26 } 27 else { 28 cout << "容器中不存在key为“88”:" << endl; 29 } 30 int num = m1.count(76); //count(key); //统计key的元素个数 31 cout << "容器中key为“76”的元素共有 " << num << " 个(map容器中不能插入相同key值的元素)" << endl; 32 num = m1.count(88); 33 cout << "容器中key为“88”的元素共有 " << num << "" << endl; 34 system("pause"); 35 return 0; 36 }
map容器的查找和统计
复制代码

运行结果:

六.排序

方法:

利用防函数控制排序规则

示例代码:

复制代码
1 /*map容器排序*/ 2 #include<iostream> 3 #include<ctime> 4 #include<map> 5 using namespace std; 6 class MyCompare { 7 public: 8 bool operator()(int x, int y) {//重载小括号 9 return x > y; //降序排序 10 } 11 }; 12 void printMap(const map<int, int, MyCompare>&m) { 13 for (map<int, int, MyCompare>::const_iterator it = m.begin(); it != m.end(); it++) { 14 cout << "key=" << (*it).first << "\tvalue=" << (*it).second << endl; 15 } 16 } 17 int main() { 18 srand((unsigned)time(NULL)); 19 map<int, int, MyCompare>m1; 20 for (int i = 0; i < 5; i++) { 21 m1.insert(pair<int, int>(i, rand())); //key:0 2 4 6 8 22 } 23 cout << "按key值降序排列" << endl; 24 printMap(m1); 25 system("pause"); 26 return 0; 27 }
map容器排序
复制代码

运行结果:

 七.总结

  听说map容器很高效,和vector、list等容器一样用得很多,但目前我是不知道它的具体应用是什么

posted @   小贼的自由  阅读(397)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示