我这里不是将他们的区别,主要讲使用他们时要注意的一些问题,主要体现在内存方面。

C++中,我们很少使用C中的数组,使用数组就意味着承担:

  • new一个数组以后,必须保证有delete来删除所分配的内存。最好是指针句柄可以*p=NULL。
  • 必须使用正确的delete,单个对象分配内存时使用delete,多个对象分配内存时使用delete[ ]。
  • 一个对象必须只被delete了一次,多次会出现意想不到的错误。
当然,这些是比起数组的缺点,vector的优势所在就是上面的都不用考虑了,不过这不是我今天的重点,了解一下也是蛮有滋味的。string中有个引用计数的问题,也是本文的重点。
一、对于vector和string,每当需要更多内存空间时,就调用和realloc类似的操作,分4步实现:
  • 分配一块大小为当前容量的某个倍数的心内存,大多数情况下是2倍。
  • 把容器中的所有元素从旧的内存复制到新的内存中
  • 析构掉旧内存中的对象
  • 释放旧内存
看到这里如果你觉得很繁琐,效率不高,那就对了,这么好的东西也是有不足的,尤其是当这些过程发生时,vector和string中的所有指针、迭代器还有引用都将变得无效,我可不是什么好事。但是我们为什么觉得他们好。reserve就是解决这一问题出现的。这之前我们看看4个函数
  • size()告诉我们容器中有多少个元素,但不会告诉我们容器可以容纳多少个元素。
  • capacity()该容器已经分配的内存可以容纳多少个元素,也就是容器可以容纳的总元素个数。如果想知道一个容器还有多少内存可以使用,那capacity()-size()就知道了。
  • resize(Container::size_type n)强迫容器改变到含有n个元素的状态,返回值是n。如果n比当前的容量小,就析构掉容器尾部的元素。如果大于当前容量就重新分配内存
  • reserve(Container::size_type n)强迫容器把它的容量变为至少n,如果n大于当前容量就变为n,小于则不变,vector直接忽略该函数,不调用,string一般用swap技巧实现内存的释放。
关于string的引用计数string引用计数。好事多磨,我继续学习去了!

vector和string相关推荐

  1. 8.了解如何把vector和string数据传给旧的API

    vector和string都是使用连续内存来存储数据,可以类似于普通数组进行处理. std::vector<int> datas; std::string strData; 获取vecto ...

  2. 向顺序容器vector、string、deque、list、forward_list中插入\删除元素时迭代器、引用、指针的变化

    1.插入元素 (1)对于vector.string来说,当在某个位置插入元素后,如果内存空间重新分配,则指向任何位置的迭代器.指针.引用都会失效: 如果内存空间没有重新分配,则在插入位置之前的迭代器. ...

  3. 获取顺序容器vector,deque,string和array的首尾元素的方法有四个

    获取顺序容器vector,deque,string和array的首尾元素的方法有四个: (1)迭代器 (2)下标 (3)front() 和 back()成员函数 (4)at()成员函数 如下所示,得到 ...

  4. 使用reserve函数避免vector和string的内存重新分配

    vector和string内部维护的内存会"自动增长",以便容纳不断放入其中的元素.调用max_size()可以返回其容量的最大限制. "自动增长"的过程如下: ...

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

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

  6. STL标准模板库中的vector、string、deque、stack、list、set和map的详细介绍——C++学习记录01

    文章目录: 1.vector 1.1 遍历方式 1.2 构造函数 1.3 容量大小问题 1.4 插入和删除 1.5 存取值 1.6 交换两个vectot的元素 1.7 预定义存储空间 2.string ...

  7. EC3-13 Prefer vector and string to dynamically allocated arrays

    用new动态分配内存时,意味着还需要:确保之后会delete删除分配的内存,正确的使用delete和delete[],确保一个分配只delete一次. 然而用vector和string,就可以避免这些 ...

  8. vector int string 化

    为什么80%的码农都做不了架构师?>>>    #include <iostream> #include <vector> #include <algo ...

  9. C++知识点4——vector与string简述

    string 使用string类必须包含头文件#include<string> string对象的初始化 1.默认初始化 string s1; 2.拷贝初始化 string s4=s1; ...

最新文章

  1. h5滚动时侧滑出现_H5触摸事件中如何判断用户滑动方向
  2. Spring Boot 线程池的创建、@Async 配置步骤及注意事项
  3. Cadence Orcad元器件位号重排与原理图页序号重排
  4. 微型计算机原理综合实验,微机原理综合实验指导书
  5. 数学中各种矩阵收集(转至其他博主)
  6. mysql增量_mysql实时增量备份
  7. C++primer 第 4 章 表达式 4.1基础 4 . 2 算术运算符 4 .3 逻辑和关系运算符 4 . 4 赋值运算符 4 .5 递增和递减运算符 4.6成员访问运算符
  8. 深度学习(七十二)tensorflow 集群训练
  9. drf版本控制 和django缓存,跨域问题,
  10. 清华大学 TUNA 协会
  11. Mondrian xml服务mysql_mondrian与java工程的集成
  12. 阿里云ECS服务器Linux-ubuntu18环境搭建
  13. html表格基础及案例示图代码。
  14. python 完全背包问题_python背包问题
  15. html脚注制作,幸福西饼:静态页面制作项目总结
  16. response.getStatusCode()==200什么意思
  17. 抖音、腾讯世纪大和解,透露了哪些信息?
  18. 外设驱动(一)E-Paper墨水屏扫描显示原理
  19. idea 设置黑色或白色背景以及图片背景
  20. linux 端口耗尽,短连接以致端口耗尽

热门文章

  1. java初始化配置_java – 初始化没有XML配置的数据库,但使用@Configuration
  2. 专访徐勇州:腾讯云全球化布局势如破竹,构建全球24小时无差别服务︱大咖访谈录...
  3. gdb调试mpi程序
  4. 数据降维降维(二)----Laplacian Eigenmaps
  5. 关于“小米盒子”等的被喷
  6. Ubuntu10.04设备未托管
  7. struts-step
  8. OpenCV-模板匹配cv::matchTemplate
  9. OpenCV-理想高通低通滤波器(C++)
  10. mysql三张表关联查询成绩表_mysql三张表关联查询