条目十三《尽量使用vector和string来代替使用数组》
2024-09-30 02:29:42
条目十三《尽量使用vector和string来代替使用数组》
数组在现代编程语言中基本都存在,应用可谓广泛,不可或缺,虽然在一些语言中(go)有切片等数据结构,但是数组还是存在的。
但是在有了stl后,在使用数组时更建议用vector和string来代替,因为在动态分配数组的内存时,需要人为的管理内存。比如在new T[]时,需要在用完分配的数组后先手工释放数组存放的对象,然后再释放数组的内存
直接使用数组的不好之处有:
- 在很多时候,如果程序运行时在动态分配数组内存后产生异常,那么就不会调用析构数组里的对象和释放内存,造成内存泄露。
- 数组不是根据存放元素动态增长的,所以在动态分配内存的时候很难把握分配内存的大小。而vector和string里头是分配子allocator来动态维护vector和string的内存空间的。
new T[...]
当T是char时有两种选择,其他时候用vector和string代替数组的选择是比较明确的,所以这里主要说说当T是char的情况。
new char[...]时可以用vector和string来代替。其实除了一种情况,其他时候基本是string代替数组的。所以直接说特殊情况就ok了。
string在底层的实现大多的厂商是实现了多线程安全的,一般是使用引用计数方法。所以在使用string的时候,不用担心线性安全的问题。但是如果你的生产环境不需要考虑线性安全的,string为了保证线性安全所做的工作就是多余的。
在这里,有几种方法可以修改string是非线性安全的:
- 1.查找厂商的文档资料,因为string的引用计数保证线性安全是一个优化,所以一般会重点标出的。而且一般有一个宏定义来开关。
- 2.自己追踪源码,这里注意string只是basic_string的一个typedef,所以使用在追踪源码的时候是查找basic_string的实现,主要是看构造函数是否有引用计数这个成员变量,如果有直接屏蔽掉对应的代码。
- 3.使用vector代替string。这一点就是上面说到的特殊情况。
如果想把老代码的接口的形参是数组的,而现在是想传其他容器进去,在这里也有办法,可以先把其他容器转换为vector或string,然后再传进去。过多的分析在后面的条目16会分析到。
最新文章
- asp.net mvc Html.BeginForm()方法
- Android基础之Activity
- C#Lambda表达式学习日记
- Oracle当前用户SQL
- HTML5阴影与渐变
- 更新ADT到Android L的方法
- 关于单页应用(SPA)的经验之谈
- 学生ID查询
- J2EE进阶(八)Hibernate与延迟加载机制探究
- 如何制作中文Javadoc包,并导入到Eclipse
- Python——threading模块(线程)
- LinkedList源码阅读笔记(1.8)
- NGUI实现滑动屏幕的时候,进行环形旋转
- text-decoration:[ text-decoration-line ] || [ text-decoration-style ] || [ text-decoration-color ] 默认值:
- vue-amap | 基于 Vue 2.x 与高德的地图组件
- php intval 两位小数乘以100后结果少1
- 对客户端攻击:adobe_toolbutton
- Matlab2013a打开M文件乱码解决
- [置顶] hdu 4418 高斯消元解方程求期望
- How to Evaluate Machine Learning Models, Part 4: Hyperparameter Tuning