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++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方法都有其适用的场景和注意事项
    2025-02-02
  • vs2019 MFC实现office界面的画图小项目

    vs2019 MFC实现office界面的画图小项目

    本文主要介绍了vs2019 MFC实现office界面的画图小项目,对大家入门有一定的帮助,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • 学生成绩管理系统C语言代码实现

    学生成绩管理系统C语言代码实现

    这篇文章主要为大家详细介绍了C语言代码实现学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 详解C++ const修饰符

    详解C++ const修饰符

    const 是 constant 的缩写,const可以帮我们避免无意之中的错误操作,本文给大家介绍C++ const修饰符的相关知识,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-05-05
  • 基于C++实现三种不同版本的通讯录

    基于C++实现三种不同版本的通讯录

    这篇文章主要为大家详细介绍了如何通过C++实现三种不同版本的通讯录(动态版本、静态版本、文件版本),文中的示例代码讲解详细,希望对大家有所帮助
    2022-11-11
  • 内联函数inline与宏定义深入解析

    内联函数inline与宏定义深入解析

    类的内敛函数是一个真正的函数。使用内联函数inline可以完全取代表达式形式的宏定义
    2013-09-09
  • C语言推箱子游戏实现代码

    C语言推箱子游戏实现代码

    这篇文章主要为大家详细介绍了C语言推箱子游戏实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • C++第三方日志库Glog基本语法详解

    C++第三方日志库Glog基本语法详解

    这篇文章主要介绍了C++第三方日志库Glog基本语法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • 字符串的模式匹配详解--BF算法与KMP算法

    字符串的模式匹配详解--BF算法与KMP算法

    这篇文章记录一下串里面的模式匹配,模式匹配,顾名思义就是给定一个被匹配的字符串,然后用一个字符串模式(模型)去匹配上面说的字符串,看后者是否在前者里面出现。常用的有2种算法可以实现,下面我们来具体探讨下
    2014-08-08
  • C++中神奇的tuple详解使用技巧及实例解析

    C++中神奇的tuple详解使用技巧及实例解析

    C++11标准新引入了一种类模板,命名为 tuple(中文可直译为元组),下面这篇文章主要给大家介绍了关于C++中神奇的tuple详解使用技巧及实例解析的相关资料,需要的朋友可以参考下
    2024-01-01

最新评论