条目十三《尽量使用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会分析到。

条目十三《尽量使用vector和string来代替使用数组》的更多相关文章

  1. 《条目十六》如何将vector和string的数据传给遗留的API

    <条目十六>如何将vector和string的数据传给遗留的API 优秀的代码是可以延续的,所以并非所有的代码都是重构的,而且有时候重构会对整个系统影响较大,投入巨大,得不偿失.然而,也不 ...

  2. 【S16】了解如何把vector和string数据传给旧的API

    1.尽量使用vector和string替换数组,但是老的代码还是使用数组.如果老的接口期望是数组,怎么办? 需要把vector和string,暴露出数组接口,也就是第一个元素的地址. 2.考虑方法Do ...

  3. STL学习笔记(二) vector和string

    条款13:vector.string优先于动态分配数组 string是basic_string<char>的类型定义许多string的背后实现都采用了引用计数的技术,可以消除不必要的内存拷 ...

  4. vector、string实现大数加法乘法

    理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将 ...

  5. 【S13】vector和string优先于动态分配的内存

    1.使用new动态分配内存,必须承担如下责任: a.使用delete释放内存: b.确保使用了正确的形式,delete与new的形式要匹配: c.不能重复delete. 2.使用vector和stri ...

  6. C++学习3--编程基础(vector、string、三种传参)

    知识点学习 Vector容器 vector是C++标准程序库中的一个类,其定义于头文件中,与其他STL组件一样,ventor属于STD名称空间: ventor是C++标准程序库里最基本的容器,设计之初 ...

  7. 怎样把vector和string数据传给旧的C API

     通常情况下.旧的C API使用数组合char*指针来进行数据交换而不是vector或string对象. 这种API还将存在非常长的一段时间,假设我们想有效地使用STL.我们就必须与它们和平共处. ...

  8. C++ 实现vector<std:string> 版本

    #include <iostream> #include <vector> #include <memory> #include <thread> #i ...

  9. C++将string转化成字符串数组

    //str为需要截断的string,pattern为分隔符 std::vector<std::string> split(std::string str,std::string patte ...

随机推荐

  1. 【原创】ubuntu14.04 LTS系统VMware虚拟机内Windows server 2008 r2系统的网络配置

    主系统:ubuntu14.04 LTS 虚拟机:VMware 内系统:Windows server 2008 r2 主系统IP:任何IP 内系统IP:192.168.202.128(自动获取,如果不是 ...

  2. 关于项目报错Dynamic Web Module 3.0 requires Java 1.6 or newer 的解决方法

    起因:今天使用maven创建web项目的时候发现项目上老是有个红X,错误如下图所示,虽然项目能正常运行起来,但是LZ的强迫症发作,不弄掉就觉得心里不舒服,于是上网查了攻略,几经周折最终大功告成,现在就 ...

  3. ref & out - C#中的参数传递

    [ref & out - C#中的参数传递] ref与out均指定函数参数按引用传递,惟一的不同是,ref传递的参数必须初始化,而out可以不用. ref与out无法作为重载的依据,即ref与 ...

  4. FP服务无法启动,端口被占用

    一.错误如下: Starting CISAgent..Exception in thread "main" com.i2.cis.util.SystemConfigurationE ...

  5. Docker学习之路(三)Docker网络详解

    1. Docker的4种网络模式 我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--net=host ...

  6. 修改QPushButton北京颜色和字体背景

    项目需要修改按钮背景的颜色 QPalette pal = startBtn.palette(); //startBtn是我已经定义好的QPushButton对象 pal.setColor(QPalet ...

  7. Solidity智能合约升级解决方案

    https://blog.zeppelin.solutions/proxy-libraries-in-solidity-79fbe4b970fd

  8. while循环 for循环的理解

    不管是while循环还是for循环都隐含着一个if else的结构,就是说,if 条件满足,那么就执行循环体内部的语句,else就做循环体外部的事情. 有一个例子我觉得特别典型,程序内部定义了一个特定 ...

  9. Luogu 3899 [湖南集训]谈笑风生

    BZOJ 3653权限题. 这题方法很多,但我会的不多…… 给定了$a$,我们考虑讨论$b$的位置: 1.$b$在$a$到根的链上,那么这样子$a$的子树中的每一个结点(除了$a$之外)都是可以成为$ ...

  10. 数据库MySQL 之 库操作

    数据库MySQL 之 库操作 浏览目录 系统数据库简介 数据库操作 命名规范 用户权限 修改密码 忘记密码 中文乱码问题 一.系统数据库简介 information_schema :虚拟库,不占用磁盘 ...