1. 初始化

c++ 11以后新增了大括号{}的初始化方式,需要注意与()的区别,如:

std::vector<int> vecTest1(5);         //初始化5个元素,每个都是0

 std::vector<int> vecTest2{ 5 };       //初始化1个元素,值是5

2.  添加元素:push_back

通过push_back添加新的元素进入vector后,vector的内存有时候会发生变化,这取决于size和capacity大小,当然这些都是系统来处理的,详细可以参考stl源码

当size<capacity的时候,直接加到末尾,不会变化

        当size==capacity的时候,会重新申请另外一块内存,然后copy过去加到尾部,这个时候就会有变化了。

对于stl的容器,都有成员:

begin()  //起始位置

end() //结束位置

size() //当前大小

         capacity() //当前容量,即已申请的内存大小

vector是一段连续的内存空间,有三个标识内存的位置,start,end,finish, size=end-start, capacity=finish-start

很多时候在使用vector的时候,会看到size=capacity,这个时候直接添加元素到尾部,内存明显是不够的,此时会重新在别处分配一块大小足够

有时候也有size<capacity, 这个时候就直接加在尾部了。

std::cout << "vecNum push back init" << std::endl;
vector<int> vecNum(5);
std::cout << "vecNum addr: " << &vecNum << std::endl;
for(auto i = 5; i < 10; i++)
{vecNum.push_back(i*10);std::cout << "vecNum push_back(" << i << ")=" << i*10 << std::endl;std::cout << "vecNum.size() = " << vecNum.size() << ",vecNum.capacity() = " << vecNum.capacity() << std::endl;std::cout << "vecNum.begin() addr: " << &(*vecNum.begin()) << std::endl;
}
std::cout << "vecNum addr: " << &vecNum << std::endl;

  

3. 关于earse和remove

erase返回的是当前删除的元素的一下个位置的迭代器,所以需要注意的是遍历时候的++运算,这个与其它list,map差不多,

    需要注意的earse后内存并未真正的清空,仅仅是删除内容,真正的容量大小capacity并没有改变,需要通过swap来实现capacity的减小

     全部清空可以考虑:vector<int>().swap(vecNum);

auto itor = vecNum.begin();
for( ; itor != vecNum.end(); )
{auto num = *itor;if(num == 60){itor = vecNum.erase(itor);break;}else{itor++;}
}

std::cout << "after erase element 60:" << std::endl;
  printVector(vecNum);
  vector<int>(vecNum).swap(vecNum); //将vecNum的内存空洞清除
  printVector(vecNum);

//remove只是通过迭代器的指针向前移动来删除,将不需要删除的元素往前移,因此需要删除的就都在尾部了

      //返回新的指向尾部需要删除的元素的迭代器

因此还是得配合earse来使用,所以一般真要删除,建议直接遍历使用earse

auto itor = remove_if(vecNum.begin(), vecNum.end(),[](int x)->bool{ return x == 20; });
//or
//auto itor = remove(vecNum.begin(), vecNum.end(),20);//通过erase删除
vecNum.erase(itor, vecNum.end());

4. 关于vector< bool>  -- 慎用

出处: https://blog.csdn.net/DoronLee/article/details/78462208

vector< bool> 并不是一个STL容器,不是一个STL容器,不是一个STL容器!

首先vector< bool> 并不是一个通常意义上的vector容器,这个源自于历史遗留问题。 

早在C++98的时候,就有vector< bool>这个类型了,但是因为当时为了考虑到节省空间的想法,所以vector< bool>里面不是一个Byte一个Byte储存的,它是一个bit一个bit储存的!

因为C++没有直接去给一个bit来操作,

所以用operator[]的时候, 正常容器返回的应该是一个对应元素的引用,

   但是对于vector< bool>实际上访问的是一个”proxy reference”而不是一个”true reference”,返回的是”std::vector< bool>:reference”类型的对象。

因此,使用auto自动类型推导时会出现问题

//vector<bool>慎用
vector<bool> vecBool = { false, true, false };
bool test1 = vecBool[0];   
auto test2 = vecBool[1];

test1 = true;    //test1的初始化它其实暗含了一个隐式的类型转换(直接对vecBool[0]赋值会修改vecBool中的值,但是对test1不会)
test2 = false;   //test2它的类型并不是bool,而是一个vector< bool>中的一个内部类,而此时如果修改test2的值,vecBool中的值也会跟着修改
auto index = 0;
for (auto i : vecBool)
{
    cout << "vecBool[" << index << "]" << i << std::endl;
    index++;
}

转载于:https://www.cnblogs.com/leehm/p/10929756.html

c++ vector 使用注意事项相关推荐

  1. c++ vector 一部分_C++ vector 使用注意事项

    作者:Leehm 链接:https://www.cnblogs.com/leehm/p/10929756.html 1.初始化 c++ 11以后新增了大括号{}的初始化方式,需要注意与()的区别,如: ...

  2. c++的vector容器

    vector容器概念 vector是表示可变大小数组的序列容器. 就像数组一样,vector也采用的连续存储空间来存储元素.也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效.但是 ...

  3. vector<int> v 与 vector<int> v(n) 的区别

    使用vector的注意事项(切记): 使用 vector<int> v; 声明一个容器v时,如果没有给他预定存储空间(如:vector<int> v;),则可以直接使用v.pu ...

  4. vector中的push_back(涉及到动态分配),resize,reserve,swap方法解析

    目录 一.vector的push_back解析 二.size和capacity 三.resize和reserve 1.resize 2.reserve 四.关于reserve的应用 五.内存释放 sw ...

  5. 29、剑指offer--最小的K个数

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题思路:使用multiset存储k个最小值 1)先存入k个值 2 ...

  6. 【java】java sftp访问文件夹,java smb访问共享文件夹 按时间过滤查找文件 集成springboot

    文章目录 java的sftp传输 sftp按时间过滤文件列表 sftp注意事项 java smb1.0传输 smb1.0按时间过滤文件列表 smb注意事项 java smb2.0/3.0传输(smbj ...

  7. c++ 常用面试题整理(不定时更新)

    c++常用面试题整理 目录 开头.学好C++需要哪些知识 第一部分. c++ 基础 1.C和C++的区别 2.C++中指针和引用的区别 3.结构体struct和共同体union(联合)的区别 4.st ...

  8. c语言vector+erase用法,vector.erase用法注意事项

    转自->这里 vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase(iterat ...

  9. c++ vector注意事项

    1.vector<int> vec(10)和vector<int> vec{10} 不同,前者vec有10个元素0,后者vec有一个元素10 2.vec.clear()和swa ...

最新文章

  1. 收藏 | 数据智能与计算机图形学领域2019推荐论文列表(附链接)
  2. Testin云测试:QQ(4.2.0)安卓版客户端可用性优秀
  3. 性能测试——JMeter脚本录制和HTTP负载测试
  4. mybatis学习(29):适用于没有自增的数据库
  5. 精雕道路怎么遍弧形_【养护技术】道路“创可贴”——沥青冷补料 六大优势助力道路养护...
  6. html为何转换为json,将HTML元素的“样式”属性转换为JSON
  7. 启航篇——四旋翼飞行器之入坑两年心路历程和毕设总结
  8. c#执行cmd命令并获取返回结果字符串
  9. Java --人民币(RMB)小写/数字转换大写工具类
  10. 写在博客文章后,关于为什么要写博客,特此提醒自己。
  11. 【云计算】云计算六大优点简单说明
  12. 方面级情感分析(一)
  13. 连载:中国最早的一代官派留学生--留美幼童 (结尾)
  14. UPRtek光谱仪维修LED光谱计维修MK350N
  15. 博士毕业三年成为博导!他自述也曾想放弃科研
  16. hexo博客中添加categories分类
  17. 网课python程序设计答案_Python程序设计知到网课答案
  18. 通过ip地址访问其他电脑的共享文件
  19. Windows 系统文件资源管理器的命令行参数(如何降权打开程序,如何选择文件)
  20. 一种高精度低功耗NB-IoT温度传感器

热门文章

  1. JS中的逻辑运算符、||,位运算符|,
  2. 再让大家清爽一下,给加班的oscer们,哈
  3. php properties,PHP ReflectionClass getStaticProperties()用法及代码示例
  4. 中国大学50强排行:北大清华复旦位列三甲
  5. 字体编辑器_三款好用的字体编辑器分享,让您拥有属于自己的字体
  6. 3.指定IP地址抓包
  7. STM32 AES 加解密流程梳理
  8. Android TTS 初体验
  9. 企业微信应用设置可信域名_怎么设置企业微信朋友圈功能?企业微信朋友圈功能有哪些限制?...
  10. 服务器没有进行新建或修改数据的操作,14-认识DjangoRESTframework