您当前的位置: 首页 >  面试
  • 2浏览

    0关注

    322博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

面试题:C++vector的动态扩容,为何是1.5倍或者是2倍

森明帮大于黑虎帮 发布时间:2021-10-02 10:29:32 ,浏览量:2

文章目录
  • 一、概述
  • 二、 高效使用vector,避免扩容
      • 1.扩容机制回顾
      • 2.如何避免扩容导致效率低
  • 三、为什么选择以倍数方式扩容
      • 1. 以等长个数进行扩容
      • 2. 以倍数方式进行扩容
      • 3. 为什么选择1.5倍或者2倍方式扩容,而不是3倍、4倍
  • 四、Windows和Linux的扩容底层原理
      • 1.Windows扩容底层
      • 2.Linux的扩容底层
  • 五、总结

一、概述

在面试时vector的扩容问题会经常被问到,比如:

  • vector是如何进行扩容的?
  • 扩容会导致效率低下,那如何避免动态扩容呢?
  • 为什么选择以1.5倍或者2倍方式进行扩容?而不是3倍4倍扩容?
  • vs为什么选择1.5倍,linux为什么选择2倍?

一系列问题下来,是否有种被吊打的感觉呢?本节我们再来深究vector扩容背后所包含的细节问题,让你的面试不再尴尬。

二、 高效使用vector,避免扩容 1.扩容机制回顾

当向vector中插入元素时,如果元素有效个数size与空间容量capacity相等时,vector内部会触发扩容机制:

开辟新空间

  • 拷贝元素。
  • 释放旧空间。

注意:每次扩容新空间不能太大,也不能太小,太大容易造成空间浪费,太小则会导致频繁扩容而影响程序效率。

2.如何避免扩容导致效率低

如果要避免扩容而导致程序效率过低问题,其实非常简单:如果在插入之前,可以预估vector存储元素的个数,提前将底层容量开辟好即可。如果插入之前进行reserve,只要空间给足,则插入时不会扩容,如果没有reserve,则会边插入边扩容,效率极其低下。

#include 
#include 
int main ()
{
    size_t sz;
    std::vector foo;
    // foo.reserve(100);   // 先将vector底层空间扩增到100个,然后插入
    sz = foo.capacity();
    std::cout             
关注
打赏
1664288938
查看更多评论
0.0427s