条目十三《尽量使用vector和string来代替使用数组》

Posted liangjf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了条目十三《尽量使用vector和string来代替使用数组》相关的知识,希望对你有一定的参考价值。

条目十三《尽量使用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的时候,不用担心线性安全的问题。但是如果你的生产环境不需要考虑线性安全的,string为了保证线性安全所做的工作就是多余的。

在这里,有几种方法可以修改string是非线性安全的:

  • 1.查找厂商的文档资料,因为string的引用计数保证线性安全是一个优化,所以一般会重点标出的。而且一般有一个宏定义来开关。
  • 2.自己追踪源码,这里注意string只是basic_string
  • 3.使用vector。这一点就是上面说到的特殊情况。

如果想把老代码的接口的形参是数组的,而现在是想传其他容器进去,在这里也有办法,可以先把其他容器转换为vector或string,然后再传进去。过多的分析在后面的条目16会分析到。


以上是关于条目十三《尽量使用vector和string来代替使用数组》的主要内容,如果未能解决你的问题,请参考以下文章

条目九《慎重选择删除元素的方法》

C++ vector<Struct> 排序不起作用

STL容器__简化版

STL容器__简化版

java面试题目

前端优化之动画为什么要尽量用css3代替js