这是我参加「第三届青训营-后端场」笔记创作活动的第1篇笔记
6个技巧来优化vector的使用 参考自上述文章,内含实验细节,翻译拙劣,海涵
-
提前初始化大小,避免反复扩容和拷贝
比如在实验里,要存储1w个数据,预设大小比逐个
push_back要快70%通常来说,vector扩容的方式是:
- 分配一块新的存储区域,通常是原来的两倍
- 把所有内容从原来的存储区,复制到现有存储区
- 销毁destroy原存储区的内容
- 释放deallocate旧内存
而且扩容会导致原有vector的迭代器,指针和引用全部失效。所以之后还需要做工作,更新这些内容。
-
使用
shrink_to_fit()来释放vector的内存-clear()或erase()不会释放内存根据实验结果,给vector分配了100个元素后,调用
erase()和clear(),再看vector的capacity,没有发生任何改变但是shrink_to_fit()就不一样了,用完之后就变为0
因此,每次在用完vector,觉得不再需要以后,就可以用
shrink_to_fit()来清空占用的内存但是,并不是所有的编译器都实现了
shrink_to_fit(),因此也可以使用container<T>(c).swap(c);//the shrink-to-fit idiom to shed excess capacity container<T>().swap(c);//the idiom to shed all contents and capacity -
当给vector填充或者拷贝时,用assignment而不是
insert()或push_back()assignment也就是直接赋值,
a=b为什么assignment更加高效?因为知道souce vector的大小,所以只需要调用一次内存管理器,来创建分配vector的内部缓冲区
Assignment is very efficient because it knows the size of the vector it is copying, and needs to call the memory manager only once to create the assigned vector’s internal buffer.
-
遍历vector时,避免使用vector::at()
有三种方式遍历vector
- 迭代器
- 用vector::at()
- 用[]
-
尽量不要在vector头部插入元素
因为需要的复杂度,如果需要反复进行头插,很有可能是你整个数据结构有问题哦
-
用
emplace_back()而不是push_back()- push_back:会先创建这个元素,然后将这个元素拷贝or移动到容器中
- emplace_back:直接在容器尾部创建这个元素,省去拷贝or移动的过程