博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 容器元素的存储和获取
阅读量:6676 次
发布时间:2019-06-25

本文共 604 字,大约阅读时间需要 2 分钟。

1、存储对象,存储的是对象的副本,并不是原对象。

2、获取对象,获取的是对象的引用,为什么要这样设计?
a、存储对象只发生一次,而获取对象往往会有多次,获取对象,如果每次都返回对象的副本,这个开销很大。
b、考虑下面的情况,修改容器中的对象,如果获取对象,返回的是副本而不是引用,没有办法修改容器中元素的值。容器必须提供另外一种方法,可以修改对象。
3、对于c[i] 获取容器c中的元素。考虑,引用容器并不存在的元素,这个时候容器该怎么处理?
容器有两种做法:a、不做检查,直接返回对应的地址。b、检查是否存在,如果不存在,插入一个缺省对象,并返回引用。
4、考虑做法b的问题
假设容器是基于连续内存,int& tmp = c[i]; c[j],容器不存在j,自动增大以便容纳这个元素,并返回引用。这种情况有可能会导致内存重分配,导致元素i的位置移动,c[i]返回的引用也就失效了,也就是tmp变成无效的引用,这显然不是用户所期望的。这就是为什么vector[] 不能添加元素,必须使用push_back。使用[]添加元素,Debug模式下,iter2解引用会导致 Debug Assertion Failed。
假如容器是基于节点的,没有上面存在的问题。比如map,map[]会去找有没有这个元素,找的结果,也就确定了位置,既然位置都确定了,构造一个缺省值,并返回引用,这个过程不会导致其他节点位置的移动。

转载地址:http://cygxo.baihongyu.com/

你可能感兴趣的文章
在js中怎样获得checkbox里选中的多个值?
查看>>
基于AllegroGraph实现Protege设计知识库模型的存储步骤
查看>>
线程中释放锁的方式
查看>>
VM环境下Linux虚拟机扩展存储空间操作方法总结
查看>>
PDB文件:每个开发人员都必须知道的
查看>>
深入理解生产者消费者
查看>>
EL表达式获取参数值${param.name}等
查看>>
Is there anyway to discover which ip addresses are connected to the db?
查看>>
远程桌面不能复制粘贴的解决办法
查看>>
实战案例解析电商对抗羊毛党的策略与技术
查看>>
Vivado开发工具熟悉之工具使用杂记
查看>>
spin_lock & mutex_lock的差别?
查看>>
Egret Engine(白鹭引擎)介绍及windows下安装
查看>>
一个小巧的C++Log输出到文件类 (转)
查看>>
Javascript动态操作CSS总结
查看>>
ZeroMQ接口函数之 :zmq_msg_init_size - 使用一个指定的空间大小初始化ZMQ消息对象...
查看>>
Linux 配置网络
查看>>
Effective JavaScript Item 21 使用apply方法调用函数以传入可变參数列表
查看>>
ViewPager中Fragment无法显示的问题
查看>>
FarBox--另类有趣的网站服务【转】
查看>>