vector底层原理

2024-09-03 00:20
文章标签 原理 底层 vector

本文主要是介绍vector底层原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一句话总结:vector底层实现了一个动态数组

vector原理

基类构成:

  • M_start 容器开始的位置
  • M_finish 容器结束的位置
  • M_end_of_storage 最后一个元素的下一个位置

1.构造函数

  • 无参构造:不申请内存空间(性能优先)
  • 初始化元素个数:动态申请内存空间

2.插入元素

插入到末尾:

  • 先检查空间是否足够,不够则重新申请原来二倍的空间,并将旧数据拷贝到新空间中,这个拷贝的过程很消耗性能,所以在创建vector对象时最好指定初始化元素的个数,减少拷贝带来的性能损失

插入到中间:

  • 将待插入位置之后的元素全部向后移动一个位置,再插入新元素

3.删除元素

删除末尾元素

  • 删除元素不会释放该元素占用的内存,只是修改(记录最后一个元素位置的指针的指向)

删除其它位置元素

  • 将该位置之后的元素全部向前移动一个位置

4.读取元素

  • 操作符[] ,读取指定位置的元素,返回具体元素的引用
  • 函数at() ,比[]多了检查越界的功能,返回元素的引用

5.修改元素

  • vector不支持直接修改
  • 通过[]或at()获取元素的引用后修改

6.释放空间

  • swap一个空容器
  • 先clear(清除元素但空间未释放),再shink_to_fit(c++11新特性,释放未使用的内存)

vector内存增长机制

1.特点:

  • 内存只增加不减少
  • 内存连续

2.增长方式

  • 无参构造:0,1,2,4,8,16…
  • 有参构造:(10),20,40 或 (50),100,200…

3.增长的具体步骤

  • 申请翻倍的空间
  • 将旧数据copy到新空间
  • 释放旧空间
  • 插入新元素

4.注意:当vector的元素为指针时,指针被释放时不会调用指针所指对象的析构函数,需要手动释放
vector 的元素是指针时,vector 在释放元素时不会自动调用指针所指对象的析构函数。它只会销毁存储在 vector 中的指针(即释放指针本身的存储空间),而不会管理指针所指向的动态内存。因此,如果 vector 中的元素是指针,在销毁 vector 或删除元素之前,必须手动释放指针指向的对象,以避免内存泄漏。

例如,假设有一个存储指针的 vector

std::vector<MyClass*> myVector;

在删除 myVector 中的元素或销毁 myVector 之前,你需要手动释放这些指针指向的内存:

for (MyClass* ptr : myVector) {delete ptr;
}
myVector.clear();

这样才能确保指针指向的对象也被正确释放。否则,尽管 vector 自身的内存会被释放,但由指针指向的对象内存将会泄漏。

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

这篇关于vector底层原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131486

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

哈希表的底层实现(1)---C++版

目录 哈希表的基本原理 哈希表的优点 哈希表的缺点 应用场景 闭散列法 开散列法 开放定值法Open Addressing——线性探测的模拟实现 超大重点部分评析 链地址法Separate Chaining——哈希桶的模拟实现 哈希表(Hash Table)是一种数据结构,它通过将键(Key)映射到值(Value)的方式来实现快速的数据存储与查找。哈希表的核心概念是哈希

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

PHP原理之内存管理中难懂的几个点

PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等. 另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们