C++学习笔记std::vector底层原理及扩容

 更新时间:2023年10月26日 11:22:33   作者:Totn  
这篇文章主要为大家介绍了C++学习之std::vector底层原理及扩容详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

std::vector

std::vector是C++标准库中的一个容器,它提供了动态数组的功能。它的底层实现是通过连续的内存块来存储元素,这使得它能够在O(1)的时间复杂度下进行随机访问。

当创建一个std::vector对象时,它会分配一块初始大小的内存空间来存储元素。这个初始大小可以通过构造函数的参数指定,如果没有指定,默认为0。std::vector还会维护两个重要的变量:sizecapacitysize表示当前已存储元素的数量,而capacity表示当前分配的内存空间的大小。

当我们向std::vector中添加元素时,它会首先检查是否有足够的容量来存储新的元素。如果当前容量不足,std::vector就需要进行扩容操作。

std::vector的扩容机制是通过重新分配内存来实现的。当容量不足时,std::vector会分配一个更大的内存块,并将原来的元素复制到新的内存中。通常,新的容量会比原来的容量大一些,以便减少频繁的扩容操作。具体来说,std::vector通常会将容量扩大为原来的两倍,但这并不是绝对的,具体实现可能会有所不同。

在进行内存重新分配时,std::vector会调用元素类型的拷贝构造函数来复制元素。如果元素类型没有提供拷贝构造函数,则无法使用std::vector存储该类型的对象。

一旦完成内存的重新分配和元素的复制,std::vector会释放原来的内存,并更新sizecapacity的值。这样,我们就可以继续向std::vector中添加新的元素了。

扩容

下面是一个简单的例子,演示了std::vector的扩容操作:

#include <iostream>
#include <vector>
int main() {
  std::vector<int> v;
  std::cout << "Capacity: " << v.capacity() << std::endl; // 输出:Capacity: 0
  for (int i = 0; i < 10; i++) {
    v.push_back(i);
    std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl;
  }
  return 0;
}

需要注意的是,由于重新分配内存和元素复制的开销,std::vector的扩容操作可能会导致性能损失。因此,为了避免频繁的扩容操作,我们可以通过预先设置std::vector的初始容量来提高性能。

总结

std::vector的底层原理是通过连续的内存块来存储元素,它的扩容机制是通过重新分配内存和元素复制来实现的。

以上就是C++学习笔记std::vector底层原理及扩容的详细内容,更多关于C++ std::vector扩容的资料请关注脚本之家其它相关文章!

相关文章

  • C 语言基础教程(我的C之旅开始了)[九]

    C 语言基础教程(我的C之旅开始了)[九]

    C 语言基础教程(我的C之旅开始了)[九]...
    2007-02-02
  • C++11的future和promise、parkged_task使用

    C++11的future和promise、parkged_task使用

    这篇文章主要介绍了C++11的future和promise、parkged_task使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • C++结构体数组实现贪吃蛇

    C++结构体数组实现贪吃蛇

    这篇文章主要为大家详细介绍了C++结构体数组实现贪吃蛇,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C++ primer超详细讲解泛型算法

    C++ primer超详细讲解泛型算法

    泛型编程,故如其名,是一个泛化的编程方式。其实现原理为程序员编写一个函数/类的代码示例,让编译器去填补出不同的函数实现
    2022-07-07
  • 一篇文章教你3分钟如何发布Qt程序

    一篇文章教你3分钟如何发布Qt程序

    这篇文章主要给大家介绍了关于教你3分钟如何发布Qt程序的相关资料,文中通过实例代码结束的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-08-08
  • C++实现LeetCode(76.最小窗口子串)

    C++实现LeetCode(76.最小窗口子串)

    这篇文章主要介绍了C++实现LeetCode(76.最小窗口子串),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 关于C语言指针赋值的问题详解

    关于C语言指针赋值的问题详解

    本篇文章是对C语言指针赋值的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • ACE反应器(Reactor)模式的深入分析

    ACE反应器(Reactor)模式的深入分析

    本篇文章是对ACE反应器(Reactor)模式进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++中4种强制类型转换的区别详析

    C++中4种强制类型转换的区别详析

    这篇文章主要给大家介绍了关于C++中4种强制类型转换区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 基于c++强制类型转换的(总结)详解

    基于c++强制类型转换的(总结)详解

    本篇文章对C++中的强制类型转换进行了详细的分析介绍。需要的朋友参考下
    2013-05-05

最新评论