C++关联容器总结一

关联容器

关联容器: 通过键(key)储存与读取元素
顺序容器: 通过元素在容器中的位置顺序储存,访问

关联容器类型
map 关联数组:元素通过键来存储和读取
set 大小可变的集合,支持通过键实现的快速读取, 具有集合的性质
multimap 支持同一个键多次出现的 map 类型
multiset 支持同一个键多次出现的 set 类型

与关联容器相关的pair
pair:一种类模板, 定义在头文件utility中
T1,T2为元素类型, 可以是容器或者类,pair类型
pair< T1,T2 >p , p对象当前具有两个属性T1,T2
访问pair对象直接使用p.first , p.second 访问其数据成员

pair<int, pair<string,int> >p1(1,"hello",1);
//注意p1前面两个大于号之间要留有空格,防止编译时看成位运算
//p1具有三个属性(int string int)
cout<<p1.first<<p1.second.first<<p1.second.second;
//first,second分别对应着p1对象的两个数据成员

关联容器
关联容器具有顺序容器大部分操作 ,但没有front, push_front, pop_front, back, push_back, pop_back,assign, resize操作
具有以下构造函数:

  • C< T >c;
  • C< T >c1(c2);
  • C< T >c(b,e)

关联容器不能通过容器大小来定义(即C< T >c(n) ), 当关联容器通过大小来定义, 就无法确定初始化的那个对象需要采用哪个值或哪些值来初始化,若采用0来初始化这n个对象时将造成多个键重复,这样就无法知道键所对应的值是哪个

map类型
map: 关联数组(采用key获取值与数组采用下标获取值一致)
map构造函数

  • map< k,v >m; 创建空的map对象, 其键与值为k, v
  • map< k,v >m(m2); 创建m2的副本, m2与m必须具有相同的key,value
  • map< k,v >m(b,e); m储存迭代器b,e之间元素的副本, 元素必须能转换为pair< const k, v >

map迭代器进行解引用的时候将产生pair对象

//m为存在键值的元素
map<string,int>::iterator iter=m.begin();
cout<<iter->first<<iter->second;

键类型约束问题
map中key不但具有类型, 还具有一个相关的比较函数,比较函数必须在键类型上定义严格弱排序,因此在map元素插入的过程中元素会依据键的大小关系进行排序,键值类型必须定义”<”操作符
详情观看转载
https://blog.csdn.net/qq_29344757/article/details/7869
例:
map对象可以使用vector< int >::iterator为key, iterator对象内置弱排序(iter可进行大小,加减比较操作)
map对象不可以使用list< int >::iterator为key, iterator对象内不能进行弱排序(iter只具有”==”与”!=”操作)

采用下标访问map对象

int main(){map<string,int>m;m["hello"]=1;m["world"]=2;map<string,int>::iterator iter=m.begin();while(iter!=m.end()){cout<<iter->first;iter++;}cout<<m["!!!"];return 0;
}

针对m的过程

  1. 在m中查找hello的元素,但未找到
  2. 将hello作为key插入m中,类型为const string, 在例子中初始值为0
  3. 将键值对插入到m中
  4. 读取插入的元素, 对其赋值为1
  5. 同理,m[“world”]与m[“hello”]的过程类似
  6. 最后的m[“!!!”]表示: 访问下标(key)未在m中的键值对,那么将会在m中添加当前键, 其值初始化为0(使用默认的构造函数进行初始化)

注:map采用下标的访问过程与vector截然不同, map中如上第6步操作, 而vector将会抛出异常

map中insert的使用
map中的insert用法与顺序容器一致, 不同在于插入的元素必须是pair类型的
map提供的insert

  • m.insert(e): e是与m类型一致的pair类型, 如果e.first不存在m中, 那么将插入e.first作为键, 其值为e.second, 返回void; 若e存在m中则返回一个pair类型对象(假设对象名是p), p.first的值是map型迭代器(迭代器指向的位置是e.first), p.second的值是一个bool类型对象(值为false), 表示是否插入该元素
  • m.insert(b,e): 插入迭代器b,e范围之间的元素(元素类型必须为m.value_type类型的键值对), 不能指明总共插入多少个元素
  • m.insert(iter,e): 以iter为起点位置,自动查找可适合的新元素储存位置, 返回一个迭代器指向当前插入的元素的位置

注:插入的元素对象既可以是pair,也可以是map< T1,T2 >::value_type(key,value); 谨记value_type是pair< const key, value >的同义词
例: 用于解释m.inset(e)的返回值操作

//统计文章中单词出现的个数
map<string,int>m;
pair<string,int>p_tran//将每次输入的world转化为pair类型
string world
while(cin>>world){pair<map<string,int>::iterator,bool>p_sum=m.insert( p_tran(world,1) );if(!p_sum->second)++(p_sum->first->second);   //表示对m中元素的值进行自增,不加括号时,注意符号优先级
}
map<string,int>::iterator iter=m.bengin();
while(iter!=m.end()){cout<<iter->first<<" 单词数目: "<<iter->second;++iter;
}

p_sum的设计方式请参考m.insert(e)的返回值确定;

map中元素查找

  • 直接类似数组的下标方式进行查找, 但是若元素未在容器中将出现插入操作,且关联值为0, 给程序造成一定的负担
  • m.count(key): 返回m中key出现的次数
  • m.find(key): key存在m中,返回指向key的迭代器, 不存在时返回超出末端的迭代器(所谓end())

map中元素的删除

  • m.erase(key): 在m中删除键为key的元素,返回size_type类型的值(表示删除的元素的个数)
  • m.erase(iter): 删除iter所指向的元素, iter!=end()且iter存在, 返回void
  • m.erase(b,e): 删除迭代器b,e范围(b,e必须为有效范围,指向m中的元素或最后一个元素的后一个位置)内的元素, 返回void

当进行map对象的遍历的时候,采用const_iterator型迭代器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

威纶触摸屏与电脑连接_PLC与这7种设备的连接方式,一看就懂!

点击上方电工小青年&#xff0c;关注并星标专业的电工电气领域自媒体&#xff0c;不容错过欢迎转发朋友圈~PLC常见的输入设备有按钮、行程开关、接近开关、转换开关、拨码器、各种传感器等&#xff0c;输出设备有继电器、接触器、电磁阀等。正确地连接输入和输出电路&#xff0…

okHttp源码解析------待续

看该篇文章前首先要熟悉okHttp的使用&#xff0c;建议先读OkHttp的简单使用 本文的源码解析参考链接&#xff1a;okhttp3总和解析 1.从URL请求处理开始分析 由异步将请求加入调度方法开始引入正题&#xff1a; getClient().newCall(request).enqueue(new Callback() {Overridep…

Android studio JNI jni实例

1.Jni的作用 1.Jni的作用 Java是一种比较高级的语言&#xff0c;Java调用c库&#xff0c;调用c库是必不可少的&#xff0c;所以Jni就应运而生了。看了这个文章的同学&#xff0c;应该能够自己写个APK装在自己的手机里面吧&#xff0c;以前刚开始做android的时候&#xff0c;写…

二叉树先序遍历,中序遍历,后序遍历,层次遍历学习总结及完整C/C++代码

伪代码阐述 先序遍历 先序遍历:先访问根节点, 然后深入左子树,直到不能深入时再深入右子树 由定义可得递归式 void travPre_R(BinNodePosi* x,VISIT& visit){if(!X) return; //到达叶子节点,开始回归visit(x->data);//向左子树深入的过程中便开始进行对每个节点的数据…

nedc工况_东南DX3 EV续航升级 NEDC综合工况续航451公里

东南DX3 EV续航升级版车型曝光&#xff0c;电池系统能量密度由之前的141Wh/kg提升至了161Wh/kg&#xff0c;NEDC综合工况续航也由老款产品的351km提升至了451km。近日&#xff0c;工信部公布了2019年第7批《新能源汽车推广应用推荐车型目录》&#xff0c;东南DX3 EV续航升级版车…

不笑找我系列 | 程序员爆笑漫画十条

原创翻译~ 转载请说明出处~~~~~~~~ 1、如果你让码农给你做个事情&#xff0c;比如修个灯泡&#xff0c;他会这样去执行你的指令 2、分享一个码农发现并解决bug的过程&#xff0c;实在是符合我们码农的人设 3、码农的一天&#xff0c;像极了我的一天 4、至今为止&#xff0c;没…

AVL树学习总结

AVL树 平衡二叉树的缺点 由于平衡二叉搜索树的search(), insert(),remove()接口的运行时间与二叉树的高度成正比,所以若不能有效控制树高, 从平均复杂度来看,二叉平衡搜索树并不能让人满意 理想平衡 二叉树的性能取决于树的高度,只有当左右子树的高度接近时才能达到理想平衡…

nginx编译安装_Nginx编译安装nginx-upsync-module模块以实现动态负载

安装依赖包OpenSSL在官网下载页下到最新稳定版1.0.2q。PCRE在 PCRE 官网可以找到下载地址&#xff0c;这里选择8.x的最高版本 pcre-8.42.tar.gz。zlibzlib 直接选择官网首页最新的zlib-1.2.11.tar.gz。下载nginx 源码包及nginx-upsync-module模块源码这里下载的是nginx稳定版ng…

centos7 qt之程序编译 cant start process “cmake”

之所以出现这个问题&#xff0c;是由于qt内置的cmake与系统已安装的cmake命令冲突。解决的方法是&#xff0c;在build里将cmake命令加上绝对路径。 问题得以解决。转载于:https://www.cnblogs.com/jiu0821/p/6762343.html

码农笑话图片十张

原创翻译~转载请说明出处~~~~~~~~1、如果你让码农给你做个事情&#xff0c;比如修个灯泡&#xff0c;他会这样去执行你的指令2、分享一个码农发现并解决bug的过程&#xff0c;实在是符合我们码农的人设3、码农的一天&#xff0c;像极了我的一天4、至今为止&#xff0c;没有遇到…

伸展树学习总结

伸展树 与AVL树类似, 伸展树也是二叉搜索树的一种形式, 伸展树无需保证时刻保持全树的平衡,也不需要像AVL树一样要求记录平衡因子的附加信息 伸展树的提出源于信息访问的局部性(刚被访问过的信息有可能再次被访问,要被访问的元素可能位于刚访问过的元素的附近), 就伸展树而言…

python的if和else、for、while语法_python-变量、if else语句 、for循环、while循环(4月26号)...

变量&#xff1a;五&#xff0e;注意&#xff1a;python是可执行程序 在linux写python第一行必须写#!/usr/bin/env python(声明解释器在windows中写python第一行需要写# -*- coding:utf-8 -*-Pycharm:开发调试效率高 在pycharm中new project 并且每天创建一个目录右键diectory…

c语言 库打印函数

函数#include<stdio.h>int printf(const char *format, ... );/* [until c99]写结果到stdout */int printf(const char *restrict format, ... );/* [since c99] */int fprintf(FILE *stream, const char *format, ... );/* [until c99]写结果到文件流stream */int fprin…

xhprof windows下安装和使用(转载)

1、使用5.3.3以上的php版本&#xff0c;或者直接下载wamp2.1集成环境。 2、下载xhprof for windows版本&#xff0c;地址&#xff1a;http://www.benjamin-carl.de/?downloadXHProf-0.10.0-PHP-5.3.3-VC6-x86-TS&#xff0c;把解压后的dll文件放到php的ext目录里面。 关于这个…

B树学习总结

B树 多路搜索树 当数据规模足够大的时候, 大部分数据存储到外存中, 常规的平衡二叉搜索树将无法满足需求理由如下: 常规二叉平衡搜索树每当进行search(),insert(),remove()操作的时候就会进行节点的切换,从而导致大量的IO操作,就此提出了多路搜索,尝试将原本的多个节点合在一…

嵌入式未来趋势是什么?

感谢CSDN编辑邀请 前几天通过了CSDN博客专家的申请&#xff0c;在CSDN博客摸爬滚打多少个日日夜夜后终于修成正果了&#xff0c;当时通过CSDN博客专家时赶紧把消息发给了以前的创新基地同学&#xff0c;想起来&#xff0c;我们那时候刚开始学习单片机&#xff0c;就是从CSDN上面…

python如何调用阿里云接口_Python调用aliyun API设置阿里云负载均衡虚拟服务器组权重...

环境准备系统环境CentOS Linux release 7.2.1511 (Core)[rootlocalhost ~]# cat /proc/versionLinux version 3.10.0-327.el7.x86_64 (builderkbuilder.dev.centos.org) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Thu Nov 19 22:10:57 UTC 2015[rootlocal…

js动态添加删除节点

转载于:https://www.cnblogs.com/jiaobaobao/p/6762692.html

C++与Java中的static成员总结

简述 在结构化程序设计中,内存中数据的共享是通过参数, 全局变量实现的; 在面向对象程序设计中函数与数据成员封装在一起, 数据共享通过类内部数据成员之间的相互访问, 外部对象则通过静态成员(即static成员)来共享数据; 接下来通过面向对象叙述static特性 C中的static 静…

书中自有黄金屋~外加中奖结果通知

人生的路很长&#xff0c;很艰辛&#xff0c;只有不断学习才能超越梦想&#xff0c;大牛是如何成长的&#xff01;首先要多看多听多写~~今天推荐一些大牛们都关注的技术公众号&#xff0c;机器学习、架构、前端、嵌入式、PY学习.....希望能够帮助到大家&#xff0c;引领我们前行…