iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中STL的vector扩容机制
  • 691
分享到

C++中STL的vector扩容机制

c++java面试 2023-08-31 14:08:54 691人浏览 八月长安
摘要

目录 前言发生扩容扩容机制size()和capacity()reserve()和resize() 前言 前阵子面试的时候,被问到往vector中插入一个数据可能会发生什么?

目录

前言

前阵子面试的时候,被问到往vector中插入一个数据可能会发生什么?

我答:可能会扩容;

为啥vector支持变长?

我答:它实在堆上动态申请内存,因此有自己的一套扩容机制,可以操作内存大小;
它有size()和capacity()记录当前的有效元素个数和容量, 还有配套的resize()管理实际存放元素个数接口 和 reserve()管理容量接口;

下面我们详解;

发生扩容

vector作为STL的常用容器之一,其特性和数组类似,拥有一段连续的内存空间。vector申请的是一段连续的内存,**当插入新的元素内存不够时,通常会再重新申请更大的一块内存,将原来的元素拷贝过去,释放旧空间。**因为内存空间是连续的,所以在进行插入和删除操作时,会造成整体内存块的拷贝,时间复杂度为O(n)。

扩容机制

size()和capacity()

不同编译器在vector的扩容策略上显然不太一致,在vector的size()(当前容器所用的空间) 等于capacity()(当前容器总空间)时,再次插入一个元素就会发生扩容

vs编译器每次是以1.5倍且向下取整的策略进行扩容,gcc编译器则是每次以2.0倍的策略进行扩容。(注意,初始size和capacity是0,在0的基础上第一次进行扩容的时候取第一次插入元素的个数!)


size()和capacity()是俩成员函数,vector中并没有直接存int size 和 capacity,存的其实是有效数据的始末地址和容量结尾地址

通过源码分析有三个指针:

在这里插入图片描述

start和finish和end_of_storage,他们三个指针用减法能算出来逻辑上的int size和int capacity数量;

reserve()和resize()

  • reserve()来改变capacity()容量的大小,是预留容器空间;

  • resize()改变size(),是有效存储元素个数;

通过源码分析:

reserve(int n)

void reserve(size_type __n){    if (__n > max_size()){        __throw_length_error(__N("vector::reserve"));    }    if (capacity() < __n){        _M_reallocate(__n);    }}

调整capacity, 存在if判断,当n>当前capacity才有效,否则什么事都不发生;

resize(int n)

void resize(size_type __new_size){    if (__new_size > size()){         _M_default_append(__new_size - size());    }    else if (__new_size < size()){        _M_erase_at_end(this->_M_impl._M_start + __new_size);    }}

调整size:

当size>=capacity时,capacity和size都扩容到size大小,多出来的有效元素补上缺省值(int为0);

当 sizesize缩减到指定大小,capacity不变;

来源地址:https://blog.csdn.net/wtl666_6/article/details/128514332

--结束END--

本文标题: C++中STL的vector扩容机制

本文链接: https://www.lsjlt.com/news/385961.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++中STL的vector扩容机制
    目录 前言发生扩容扩容机制size()和capacity()reserve()和resize() 前言 前阵子面试的时候,被问到往vector中插入一个数据可能会发生什么? ...
    99+
    2023-08-31
    c++ java 面试
  • C++STL中vector容器的使用
    目录一、vector(1)区分size()和capacity()(2)迭代器失效(3)区分const_iterator和const iterator(4)区分reserve()和re...
    99+
    2024-04-02
  • C++ STL vector的模拟实现
    1. vector的介绍和使用 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对v...
    99+
    2024-04-02
  • C++中STL vector的模拟实现示例
    这篇文章主要介绍C++中STL vector的模拟实现示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. vector的介绍和使用vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存...
    99+
    2023-06-14
  • 关于STL中vector容器的一些总结
    1.vector的简单介绍 vector作为STL提供的标准容器之一,是经常要使用的,有很重要的地位,并且使用起来也是灰常方便。vector又被称为向量,vector可以形象的描述为...
    99+
    2022-11-15
    STL vector
  • 详解C++ STL vector容量(capacity)和大小(size)的区别
    很多初学者分不清楚 vector 容器的容量(capacity)和大小(size)之间的区别,甚至有人认为它们表达的是一个意思。本节将对 vector 容量和大小各自的含义做一个详细...
    99+
    2024-04-02
  • C++STL中vector模板类是什么
    小编给大家分享一下C++STL中vector模板类是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!vector模板类创建vector对象,遍历元素vector...
    99+
    2023-06-29
  • C++中STL标准库std::vector怎么用
    小编给大家分享一下C++中STL标准库std::vector怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 简介vector 是表示可以改变大小的数组的...
    99+
    2023-06-29
  • 详解C++ STL vector容器访问元素的几种方式
    学会如何创建并初始化 vector 容器之后,本节继续来学习如何获取(甚至修改)容器中存储的元素。 访问vector容器中单个元素 首先,vector 容器可以向普通数组那样访问...
    99+
    2024-04-02
  • HashMap的扩容机制
    目录 一、HashMap的底层 二、HashMap的扩容机制原理 1、JDK1.7版本扩容 2、JDK1.8版本扩容 三、HashMap底层JDK1.7到JDK1.8的变化 一、HashMap的底层 底层:采用数组+链表(JDK1.7)...
    99+
    2023-09-04
    java 面试 数据结构 链表 容器
  • STL中vector的使用你了解吗
    目录前言1.vector是什么2.vector创建对象3.遍历vector(1)下标遍历(2)迭代器遍历(3)范围for遍历3.vector容量函数4.vector的扩容函数5.ve...
    99+
    2024-04-02
  • C++STL标准库std::vector的使用详解
    目录1. 简介2. 使用示例3. 构造、析构、赋值3.1 std::vector::vector 构造函数3.2 std::vector::~vector 析构函数3.3 std::...
    99+
    2024-04-02
  • c++中stl容器干什么用的
    stl 容器在 c++ 中的作用是存储和管理各种类型的数据,从而提供数据组织、内存管理、通用性、效率和可扩展性等优势。 STL 容器在 C++ 中的作用 STL(标准模板库)容器是包含...
    99+
    2024-05-06
    c++ 标准库
  • 详解ArrayList的扩容机制
    目录一、ArrayList 了解过吗?它是啥?有啥用?二、ArrayList 如何指定底层数组大小的三、数组的大小一旦被规定就无法改变四、ArrayList 具体是怎么添加数...
    99+
    2024-04-02
  • C++ 基础函数的介绍及使用(Vector+deque+STL)
    目录一、Vector的基础函数1. 构造函数2. 增加元素3. 删除元素4. 遍历vector5. 判断函数6. 大小函数7. 其他函数二、deque的介绍及使用三、deque 和 ...
    99+
    2024-04-02
  • ArrayList扩容机制(原理)
    ArrayList扩容的本质就是计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中去。(不是原数组,而是新数组然后给予数组对象地址)。 默认情况下,新的容量会是原容量的1.5倍。 新容量=旧容量右移一位(相当于除于2)在加...
    99+
    2023-09-03
    java 开发语言
  • C++ STL中的容器适配器实现
    1 stack 1.1 stack 介绍  stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 ...
    99+
    2024-04-02
  • C++实现STL容器的示例
    各大容器的特点: 1.可以用下标访问的容器有(既可以插入也可以赋值):vector、deque、map; 特别要注意一下,vector和deque如果没有预先指定大小,是不能用下标法...
    99+
    2024-04-02
  • C++STL容器中string类怎么用
    这篇文章将为大家详细讲解有关C++STL容器中string类怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言为什么学习string类:在C语言中,字符串是以'\0'结尾的集合,为了...
    99+
    2023-06-29
  • Java基础之ArrayList的扩容机制
    我们知道Java中的ArrayList对象底层是基于数组实现的,而数组是有长度限制的,那基于数组实现的ArrayList是否有长度限制呢?我们通过ArrayList的构造方法来剖析 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作