条目十三《尽量使用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. Cause: java.sql.SQLException: 无效的列索引

    今天调试代码发现“Cause: java.sql.SQLException: 无效的列索引”,查资料得出结论如下: 1.sql串的?号用''括了起来. 例如:select* from user t  ...

  2. Mysql问题随记

    [用户创建并授权远程访问] CREATE USER 'username'@'host' IDENTIFIED BY 'password’;   @后面跟主机地址,即这个用户可以从哪些地址访问数据库,l ...

  3. spring中aop原理

  4. duck typing

    在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决 ...

  5. 190. Reverse Bits 二进制相反数

    [抄题]: Reverse bits of a given 32 bits unsigned integer. Example: Input: 43261596 Output: 964176192 E ...

  6. Luogu 2403 [SDOI2010]所驼门王的宝藏

    BZOJ 1924 内存要算准,我MLE了两次. 建立$n + r + c$个点,对于一个点$i$的坐标为$(x, y)$,连边$(n + x, i)$和$(n + r + y, i)$,代表这一列和 ...

  7. pip镜像源配置

    #配置文件路径:%HOME%\pip\pip.ini,不存在新建即可 #在 Windows 2000 以上版本里,%HOME% 目录指的是系统盘下的“\Documents and Settings\你 ...

  8. vue.js的一些模板指令简述

    1.模板指令都是写在<template></template>html里面   v-text : value是什么就显示什么,如果value里面有html的标签,也会直接显示出 ...

  9. Odometry的发布和发布odom到base_link的tf变换

    转载自http://www.ncnynl.com/archives/201702/1328.html ROS发布nav_msgs/Odometry消息,以及通过tf从“odom”坐标系到“base_l ...

  10. [GO]随机生成切片元素并使用冒泡排序方式进行排序

    package main import ( "math/rand" "time" "fmt" ) func ButtleData(s []i ...