6个技巧优化vector的使用

355 阅读2分钟

这是我参加「第三届青训营-后端场」笔记创作活动的第1篇笔记

6个技巧来优化vector的使用 参考自上述文章,内含实验细节,翻译拙劣,海涵

  1. 提前初始化大小,避免反复扩容和拷贝

    比如在实验里,要存储1w个数据,预设大小比逐个push_back要快70%

    通常来说,vector扩容的方式是:

    • 分配一块新的存储区域,通常是原来的两倍
    • 把所有内容从原来的存储区,复制到现有存储区
    • 销毁destroy原存储区的内容
    • 释放deallocate旧内存

​ 而且扩容会导致原有vector的迭代器,指针和引用全部失效。所以之后还需要做工作,更新这些内容。

  1. 使用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
    
  2. 当给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.

  3. 遍历vector时,避免使用vector::at()

    有三种方式遍历vector

    • 迭代器
    • 用vector::at()
    • 用[]
  4. 尽量不要在vector头部插入元素

    因为需要O(n)O(n)的复杂度,如果需要反复进行头插,很有可能是你整个数据结构有问题哦

  5. emplace_back()而不是push_back()

    • push_back:会先创建这个元素,然后将这个元素拷贝or移动到容器中
    • emplace_back:直接在容器尾部创建这个元素,省去拷贝or移动的过程