喜欢的话可以收藏转发加关注
1、初始化
c++ 11以后新增了大括号{}的初始化方式,需要注意与()的区别,如:
std::vector vecTest1(5); //初始化5个元素,每个都是0
std::vector vecTest2{ 5 }; //初始化1个元素,值是5
![69f82b274aa69d0710cc2af5a5f7b3cb.png](https://i-blog.csdnimg.cn/blog_migrate/b454611a20464dc1263aac12ad17e895.jpeg)
2、添加元素:push_back
通过push_back添加新的元素进入vector后,vector的内存有时候会发生变化,这取决于size和capacity大小,当然这些都是系统来处理的,详细可以参考stl源码
当size
当size==capacity的时候,会重新申请另外一块内存,然后copy过去加到尾部,这个时候就会有变化了。
对于stl的容器,都有成员:
begin() //起始位置
end() //结束位置
size() //当前大小
capacity() //当前容量,即已申请的内存大小
vector是一段连续的内存空间,有三个标识内存的位置,start,end,finish, size=end-start, capacity=finish-start
很多时候在使用vector的时候,会看到size=capacity,这个时候直接添加元素到尾部,内存明显是不够的,此时会重新在别处分配一块大小足够
有时候也有size
![51046277b54030e3c8859820be66c1db.png](https://i-blog.csdnimg.cn/blog_migrate/adf3eeb1a485ccbc6d6e164d979518c8.jpeg)
![bf8fe89c59f5b6317e098d85adacea79.png](https://i-blog.csdnimg.cn/blog_migrate/b98e7f7af434df6a76cac2dba0cac076.jpeg)
3、关于earse和remove
erase返回的是当前删除的元素的一下个位置的迭代器,所以需要注意的是遍历时候的++运算,这个与其它list,map差不多,
需要注意的earse后内存并未真正的清空,仅仅是删除内容,真正的容量大小capacity并没有改变,需要通过swap来实现capacity的减小
全部清空可以考虑:vector().swap(vecNum);
![57c48125f40019a19b27659e3ea24b8b.png](https://i-blog.csdnimg.cn/blog_migrate/1de1db43d40e5893436fd21295721096.jpeg)
![aa69f9c5636a6a0d1d29dd1ce0070017.png](https://i-blog.csdnimg.cn/blog_migrate/8727bc87297de3bcaa5703cc0b4f5ab7.jpeg)
//remove只是通过迭代器的指针向前移动来删除,将不需要删除的元素往前移,因此需要删除的就都在尾部了
//返回新的指向尾部需要删除的元素的迭代器
因此还是得配合earse来使用,所以一般真要删除,建议直接遍历使用earse
![a9f0c51778340d85265d611fc009cb1a.png](https://i-blog.csdnimg.cn/blog_migrate/1756dff21360be0b3c8e8a6b24865ccb.jpeg)
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自动类型推导时会出现问题
![5723eeec87f1d4e1140b99a5dcff5986.png](https://i-blog.csdnimg.cn/blog_migrate/6f018eacf17cdc7699071ee46c20d81c.jpeg)
学习C/C++的伙伴可以私信回复小编“学习”领取全套免费C/C++学习资料、视频
![24c5b9729076d16cb9413adde7538433.png](https://i-blog.csdnimg.cn/blog_migrate/f046413727422427df04d1b4bde977bb.jpeg)