page contents

vector 底层原理及其相关面试题?

轩辕小不懂 发布于 2022-01-07 14:29
阅读 611
收藏 0
分类:C/C++开发
  • c
  • c++
  • 2835
    Nen
    Nen
    - 程序员

    (1)vector的底层原理

    vector底层是一个动态数组,包含三个迭代器,start和finish之间是已经被使用的空间范围,end_of_storage是整块连续空间包括备用空间的尾部。

    当空间不够装下数据(vec.push_back(val))时,会自动申请另一片更大的空间(1.5倍或者2倍),然后把原来的数据拷贝到新的内存空间,接着释

    放原来的那片空间【vector内存增长机制】。

    当释放或者删除(vec.clear())里面的数据时,其存储空间不释放,仅仅是清空了里面的数据。

    因此,对vector的任何操作一旦引起了空间的重新配置,指向原vector的所有迭代器会都失效了。

    (2)vector中的reserve和resize的区别
    reserve是直接扩充到已经确定的大小,可以减少多次开辟、释放空间的问题(优化push_back),就可以提高效率,其次还可以减少多次要拷贝数
    据的问题。reserve只是保证vector中的空间大小(capacity)最少达到参数所指定的大小n。reserve()只有一个参数。
    resize()可以改变有效空间的大小,也有改变默认值的功能。capacity的大小也会随着改变。resize()可以有多个参数。
    (3)vector中的size和capacity的区别
    size表示当前vector中有多少个元素(finish – start),而capacity函数则表示它已经分配的内存中可以容纳多少元素(end_of_storage – start)。
    (5)vector迭代器失效的情况
    当插入一个元素到vector中,由于引起了内存重新分配,所以指向原内存的迭代器全部失效。
    当删除容器中一个元素后,该迭代器所指向的元素已经被删除,那么也造成迭代器失效。erase方法会返回下一个有效的迭代器,所以当我们要删除
    某个元素时,需要it=vec.erase(it);。
    (6)正确释放vector的内存(clear(), swap(), shrink_to_fit())
    vec.clear():清空内容,但是不释放内存。
    vector().swap(vec):清空内容,且释放内存,想得到一个全新的vector。
    vec.shrink_to_fit():请求容器降低其capacity和size匹配。
    vec.clear();vec.shrink_to_fit();:清空内容,且释放内存。
    (7)vector 扩容为什么要以1.5倍或者2倍扩容?
    根据查阅的资料显示,考虑可能产生的堆空间浪费,成倍增长倍数不能太大,使用较为广泛的扩容方式有两种,以2倍的方式扩容,或者以1.5倍的
    方式扩容。
    以2倍的方式扩容,导致下一次申请的内存必然大于之前分配内存的总和,导致之前分配的内存不能再被使用,所以最好倍增长因子设置为(1,2)之
    间:
    (8)vector的常用函数
    vector<int> vec(10,100); 创建10个元素,每个元素值为100
    vec.resize(r,vector<int>(c,0)); 二维数组初始化
    reverse(vec.begin(),vec.end()) 将元素翻转
    sort(vec.begin(),vec.end()); 排序,默认升序排列
    vec.push_back(val); 尾部插入数字
    vec.size(); 向量大小
    find(vec.begin(),vec.end(),1); 查找元素
    iterator = vec.erase(iterator) 删除元素
    请先 登录 后评论