STL之map与pair常用函数详解

#include

#include

#include

using namespace std;

int main()

{

map<char,int> mp;

char key;

int val;

int t=5;

while(t–)

{

cin>>key>>val;

mp.insert(pair<char,int>(key,val)); // 以pair来插入

}

for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)

{

cout<first<<" "<second<<endl;

}

return 0;

}

#include

#include

#include

using namespace std;

int main()

{

map<char,int> mp;

char key;

int val;

int t=5;

while(t–)

{

cin>>key>>val;

mp.insert(pair<char,int>(key,val));

}

// 这种基于范围的for循环,只有C++11以上才可以

for(auto it=mp.begin();it!=mp.end();it++)

{

cout<first<<" "<second<<endl;

}

return 0;

}

  • 用insert函数插入**value_type**数据,下面举例说明

#include

#include

#include

using namespace std;

int main() {

map<int, string> mapStudent;

mapStudent.insert(map<int,string>::value_type(1,“student1”));

mapStudent.insert(map<int,string>::value_type(2,“student2”));

mapStudent.insert(map<int,string>::value_type(3,“student2”));

for(map<int,string>::iterator it=mapStudent.begin();it!=mapStudent.end();it++)

cout<first<<" "<second<<endl;

return 0;

}

// 输出结果:

G:\clion\qifei\cmake-build-debug\qifei.exe

1 student1

2 student2

3 student2

Process finished with exit code 0

四.map常用函数解析

  • find()用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器,程序说明:

#include

#include

#include

using namespace std;

int main() {

map<int, string> mapStudent;

mapStudent.insert(map<int,string>::value_type(1,“student1”));

mapStudent.insert(map<int,string>::value_type(2,“student2”));

mapStudent.insert(map<int,string>::value_type(3,“student2”));

map<int,string>::iterator pter=mapStudent.find(2);

cout<first<<" "<second<<endl;

return 0;

}

// 输出结果:

2 student2

  • erase()删除元素有两种方法:删除单个元素;删除一个区间的元素。
  1. 删除单个元素:
  • mp.erase(it), it为要删除的元素的迭代器

#include

#include

#include

using namespace std;

int main() {

map<int, string> mapStudent;

mapStudent.insert(map<int,string>::value_type(1,“student1”));

mapStudent.insert(map<int,string>::value_type(2,“student2”));

mapStudent.insert(map<int,string>::value_type(3,“student2”));

map<int,string>::iterator pter=mapStudent.find(2);

mapStudent.erase(pter);

for(map<int,string>::iterator it=mapStudent.begin();it!=mapStudent.end();it++)

cout<first<<" "<second<<endl;

return 0;

}

// 输出结果:

1 student1

3 student2

  • 通过键值来删除一个元素:

#include

#include

#include

using namespace std;

int main() {

map<int, string> mapStudent;

mapStudent.insert(map<int,string>::value_type(1,“student1”));

mapStudent.insert(map<int,string>::value_type(2,“student2”));

mapStudent.insert(map<int,string>::value_type(3,“student2”));

map<int,string>::iterator pter=mapStudent.find(2);

mapStudent.erase(2);

for(map<int,string>::iterator it=mapStudent.begin();it!=mapStudent.end();it++)

cout<first<<" "<second<<endl;

return 0;

}

// 输出结果:

1 student1

3 student2

2.erase(first,last),可以删除整个区间的元素;删除区间为[first,last)。

#include

#include

#include

using namespace std;

int main() {

map<int, string> mapStudent;

mapStudent.insert(map<int,string>::value_type(1,“student1”));

mapStudent.insert(map<int,string>::value_type(2,“student2”));

mapStudent.insert(map<int,string>::value_type(3,“student3”));

mapStudent.insert(map<int,string>::value_type(4,“student4”));

mapStudent.insert(map<int,string>::value_type(5,“student5”));

mapStudent.insert(map<int,string>::value_type(6,“student6”));

mapStudent.insert(map<int,string>::value_type(7,“student7”));

map<int,string>::iterator pter=mapStudent.find(4);

mapStudent.erase(pter,mapStudent.end());

for(map<int,string>::iterator it=mapStudent.begin();it!=mapStudent.end();it++)

cout<first<<" "<second<<endl;

return 0;

}

// 输出结果:

1 student1

2 student2

3 student3

  • size() ,可以获取map中的映射对数。

#include

#include

#include

using namespace std;

int main() {

map<int, string> mapStudent;

mapStudent.insert(map<int,string>::value_type(1,“student1”));

mapStudent.insert(map<int,string>::value_type(2,“student2”));

mapStudent.insert(map<int,string>::value_type(3,“student3”));

mapStudent.insert(map<int,string>::value_type(4,“student4”));

mapStudent.insert(map<int,string>::value_type(5,“student5”));

mapStudent.insert(map<int,string>::value_type(6,“student6”));

mapStudent.insert(map<int,string>::value_type(7,“student7”));

cout<<mapStudent.size()<<endl;

return 0;

}

// 输出结果:

7

  • clear(),请空所有的元素。

#include

#include

#include

using namespace std;

int main() {

map<int, string> mapStudent;

mapStudent.insert(map<int,string>::value_type(1,“student1”));

mapStudent.insert(map<int,string>::value_type(2,“student2”));

mapStudent.insert(map<int,string>::value_type(3,“student3”));

mapStudent.insert(map<int,string>::value_type(4,“student4”));

mapStudent.insert(map<int,string>::value_type(5,“student5”));

mapStudent.insert(map<int,string>::value_type(6,“student6”));

mapStudent.insert(map<int,string>::value_type(7,“student7”));

mapStudent.clear();

cout<<mapStudent.size()<<endl;

return 0;

}

// 输出结果:

0

map和unordered_map(c++11)的使用


unordered_map的用法和map是一样的,提供了 insert,size,count等操作,并且里面的元素也是以pair类型来存贮的。其底层实现是完全不同的,上方已经解释了,但是就外部使用来说却是一致的

map和unordered_map的差别


需要引入的头文件不同

map: #include < map >

unordered_map: #include < unordered_map >

内部实现机理不同

map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。

unordered_map: unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的。哈希表详细介绍

优缺点以及适用处

map:

优点:

有序性,这是map结构最大的优点其元素的有序性在很多应用中都会简化很多的操作

红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高

缺点:空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间

适用处:对于那些有顺序要求的问题,用map会更高效一些

unordered_map:

优点: 因为内部实现了哈希表,因此其查找速度非常的快

缺点: 哈希表的建立比较耗费时间

适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map

总结:

内存占有率的问题就转化成红黑树 VS hash表 , 还是unorder_map占用的内存要高。

但是unordered_map执行效率要比map高很多

对于unordered_map或unordered_set容器,其遍历顺序与创建该容器时输入的顺序不一定相同,因为遍历是按照哈希表从前往后依次遍历的

#include

#include <unordered_map>

#include

using namespace std;

int main() {

unordered_map<int, string> mapStudent;

mapStudent.insert(unordered_map<int,string>::value_type(2,“student2”));

mapStudent.insert(unordered_map<int,string>::value_type(4,“student4”));

mapStudent.insert(unordered_map<int,string>::value_type(5,“student5”));

mapStudent.insert(unordered_map<int,string>::value_type(3,“student3”));

mapStudent.insert(unordered_map<int,string>::value_type(7,“student7”));

mapStudent.insert(unordered_map<int,string>::value_type(6,“student6”));

mapStudent.insert(unordered_map<int,string>::value_type(1,“student1”));

for(auto it=mapStudent.begin();it!=mapStudent.end();it++)

cout<first<<" "<second<<endl;

return 0;

}

// 输出结果:

G:\clion\qifei\cmake-build-debug\qifei.exe

1 student1

6 student6

7 student7

2 student2

4 student4

5 student5

3 student3

Process finished with exit code 0

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

【Android高级架构视频学习资源】

Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》
点击传送门,即可获取!

,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

[外链图片转存中…(img-EVnUUcl1-1715875340035)]

【Android高级架构视频学习资源】

Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》
点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值