c++ vector介绍

1、什么是vector

std::vector 是C++标准库(STL)中的一个动态数组类模板。它允许存储相同类型的元素集合,并且可以根据需要动态地增加或减少其大小。std::vector 提供了一组函数来访问、插入和删除元素,以及执行其他与数组操作相关的任务。使用 std::vector 可以避免手动管理动态数组时可能遇到的许多常见问题,如内存泄漏和越界访问。

2、vector背后实现原理

std::vector 通常在内部使用一个连续的内存块来存储元素。这意味着它的元素在内存中是顺序排列的,这有助于快速访问和迭代。当 std::vector 需要增长时,它会分配一个更大的内存块,通常大小是原容量的两倍或更多,然后将旧元素复制到新内存块中,并释放旧内存块。这种增长策略有助于减少内存分配和复制操作的次数,但也可能导致一些额外的内存浪费。

3、vector都有哪些操作API,并举例介绍api的使用方法

std::vector 提供了丰富的API来操作元素,以下是一些常用的API及其使用方法:

(1)构造函数
std::vector<int> vec;                       // 默认构造函数,创建一个空的vector  
std::vector<int> vec(10);                  // 创建一个包含10个元素的vector,默认初始化为0  
std::vector<int> vec(10, 5);               // 创建一个包含10个元素的vector,每个元素初始化为5  
std::vector<int> vec2(vec);               // 通过另一个vector复制构造

(2)添加和插入元素
vec.push_back(42);                         // 在vector末尾添加一个元素  
vec.insert(vec.begin(), 100);             // 在vector开始位置插入一个元素  
vec.emplace_back(1, 2, 3);               // 在vector末尾构造并添加一个元素(使用构造函数参数)
(3)访问元素
int first = vec[0];                       // 通过下标访问元素  
int last = vec.back();                    // 访问vector的最后一个元素  
int atThird = vec.at(2);                  // 通过at函数访问元素(会进行范围检查)
(4)删除元素
vec.pop_back();                           // 删除vector的最后一个元素  
vec.erase(vec.begin());                   // 删除vector的第一个元素  
vec.erase(vec.begin() + 1, vec.end() - 1); // 删除一个范围内的元素  
vec.clear();                             // 清空vector,删除所有元素
(5)修改元素大小
vec.resize(20);                           // 改变vector的大小为20,如果新大小大于当前大小,则新元素默认初始化为0  
vec.resize(10, 100);                     // 改变vector的大小为10,如果新大小小于当前大小,则删除多余元素;如果新大小大于当前大小,则新元素初始化为100
(6)容量和大小
size_t size = vec.size();                // 获取vector中元素的个数  
size_t capacity = vec.capacity();       // 获取vector的容量(已分配的内存大小)  
vec.shrink_to_fit();                    // 尝试减少vector的容量以匹配其大小

(7)迭代器
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {  std::cout << *it << " ";  
}  
std::cout << std::endl;  // 使用范围for循环  
for (const auto& elem : vec) {  std::cout << elem << " ";  
}  
std::cout << std::endl;

4、时间复杂度和空间复杂度

(1)空间复杂度

        std::vector 的空间复杂度是 O(n),其中 n 是当前存储在 vector 中的元素数量。这是因为 vector 需要为其所有元素分配连续的内存空间。此外,vector 还可能分配额外的内存空间以支持未来的增长,但这部分空间仍然与元素数量成线性关系。

(2)时间复杂度

   std::vector 的时间复杂度取决于你执行的具体操作:

  • 访问元素:通过下标访问元素(如 vec[i])是常数时间复杂度 O(1),因为元素在内存中是连续存储的,可以直接通过计算偏移量来访问。

  • 在末尾添加或删除元素:对于 push_backpop_back 等在 vector末尾进行的操作,如果不需要重新分配内存,那么它们是常数时间复杂度 O(1)。然而,如果当前容量不足以容纳新元素,vector 会重新分配内存并复制现有元素到新位置,这种情况下时间复杂度可能达到 O(n)。但是,重新分配是摊还常数时间的,因为它不会每次都发生,且平均下来每次插入或删除操作的时间复杂度仍然是常数。

  • 在任意位置插入或删除元素:对于 insert 和 erase 等在 vector 中间位置进行的操作,时间复杂度是 O(n),因为可能需要移动插入点或删除点之后的所有元素。

  • 改变 vector 的大小:使用 resize 函数改变 vector 的大小,如果新大小大于当前大小,则可能需要构造新的元素(时间复杂度与新增元素的数量成正比);如果新大小小于当前大小,则需要删除多余的元素(时间复杂度与删除元素的数量成正比)。因此,时间复杂度至少是 O(k),其中 k 是改变的大小量。

需要注意的是,虽然 std::vector 在某些情况下可能需要进行内存重新分配和元素复制,但这些操作的开销通常是摊还的,即它们在平均情况下的时间复杂度仍然是相对较低的。因此,std::vector 仍然是一种高效且常用的动态数组实现。

总的来说,std::vector 的空间复杂度是 O(n),而时间复杂度则取决于你执行的具体操作以及是否需要重新分配内存。在实际应用中,由于 vector 提供了高效的内存管理和访问机制,它通常是一个很好的选择,尤其是在需要频繁访问元素或添加元素到末尾的情况下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/782793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新收获——蓝桥杯单片机第十四届国赛程序设计题

大家要是初学&#xff0c;可以去看西风那里的系统课程&#xff0c;非常全面&#xff0c;有利于形成你自己的代码风格。 笔者发文章只是分享性的&#xff0c;有需要者才拿去用其中的一个小片段。 代码在这&#xff1a; 一、这个是首写自主完成的&#xff0c;bug应该也是没有的…

预处理详解(一) -- 预定义符号与#define定义

目录 一. 预定义符号二. #define1.#define定义常量2.#define定义宏3.带有副作用的宏参数4.宏替换的规则5.宏和函数的对比 一. 预定义符号 %s _ _FILE_ _ //文件 %s _ _ DATE_ _ //日期 %s _ _ TIME_ _ //时间 %d _ _ LINE_ _ //行号 %d _ _ STDC_ _ //如果编译器支持 ANSI C,那…

Vmware下减小Ubuntu系统占用系统盘大小

1、虚拟机设置下占用空间 如图&#xff0c;给虚拟机分配了120GB&#xff0c;已经占用116.9GB&#xff0c;开机会提示空间不足。 2、实际使用空间 ubuntu系统下使用“df -h”命令查看实际使用空间大小50GB左右 造成这个原因是&#xff0c;虚拟机的bug&#xff1a;在虚拟机的ub…

算法学习——LeetCode力扣动态规划篇6

算法学习——LeetCode力扣动态规划篇6 121. 买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&…

ADC--数模转换器的使用

目录 前言 ADC接口使用 配置准备 确定引脚编号 光敏电阻--PF7​编辑 ADC3_IN5 开始配置 实验进阶 MQ_3--酒精传感器、水位传感器、火焰传感器 前言 ADC(analog-digital conversion)顾名思义模拟数字转换器,把外界的譬如温度、湿度、酒精含量、水位、特殊光波等等的现实…

突破编程_C++_网络编程(OSI 七层模型(网络层))

1 网络层的功能与作用 1.1 功能与作用详解 OSI 网络层是 OSI 参考模型中的第三层&#xff0c;位于数据链路层和应用层之间&#xff0c;其主要功能与作用涉及到网络中的数据通信和端到端的连接服务。其详细的功能与作用如下&#xff1a; 路由选择与分组交换&#xff1a;网络层…

通过PandasAI使用自然语言进行数据分析

通过PandasAI使用自然语言进行数据分析 介绍 ​ PandasAI是一个Python库&#xff0c;可以很容易地用自然语言向数据提问。它可以帮助您使用生成人工智能来探索、清理和分析数据。 使用PandasAI 这里使用Anaconda和Jupyter使用PandasAI 进入一个文件目录 创建一个 Notebook …

道可云元宇宙每日资讯|元宇宙标准化工作组成立大会召开

道可云元宇宙每日简报&#xff08;2024年3月28日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 元宇宙标准化工作组成立大会召开 3月21日&#xff0c;元宇宙标准化工作组成立大会暨第一次全体委员会议在浙江省丽水市青田县召开。元宇宙标准化工作组的建立&#…

阿里云服务器初始化简记

文章目录 推荐版本CPU、内存、硬盘视活动而定&#xff0c;一般活动价99元一年注意带宽云服务器具体设置建议系统推荐CentOS 7.9本地系统推荐MacOSiTerm2本地系统推荐Win11Linux子系统推荐开发环境NginxPythonMySQL 机器和系统基本状况测试网速设置Vim显示中文其他系统状态监控和…

Python | Leetcode Python题解之第2题两数相加

题目&#xff1a; 题解&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def addTwoNumbers(self, l1: Optional[ListNode], l2: Optiona…

仓库规划csp

满分代码&#xff08;直接暴力&#xff09; #include<iostream> using namespace std; const int M11; const int N1001; int n,m; int a[N][M]; bool isfather(int x,int y)//y是否是x的上级仓库 {for(int i1;i<m;i){if(a[x][i]>a[y][i])return false;}return …

LabVIEW无人机大气数据智能测试系统

LabVIEW无人机大气数据智能测试系统 随着无人机技术的迅速发展&#xff0c;大气数据计算机作为重要的机载设备&#xff0c;在确保飞行安全性方面发挥着重要作用。设计了一套基于LabVIEW的无人机大气数据智能测试系统&#xff0c;通过高效、稳定的性能测试&#xff0c;及时发现…

统计XML文件内标签的种类和其数量及将xml格式转换为yolov5所需的txt格式

1、统计XML文件内标签的种类和其数量 对于自己标注的数据集&#xff0c;需在标注完成后需要对标注好的XML文件校验&#xff0c;下面是代码&#xff0c;只需将SrcDir换成需要统计的xml的文件夹即可。 import os from tqdm import tqdm import xml.dom.minidomdef ReadXml(File…

图像缩放算法双立方插值法

双立方插值法&#xff08;Bicubic Interpolation&#xff09;是一种常用的图像缩放算法&#xff0c;它通过对原始图像中的像素进行加权平均来计算目标图像中的像素值。相比双线性插值&#xff0c;双立方插值能更好地保留图像的细节和平滑过渡效果。 具体实现步骤如下&#xff…

Vue路由导航守卫

一、什么是Vue路由导航守卫&#xff1f; Vue路由导航守卫是Vue Router提供的一种机制&#xff0c;它可以让你在路由跳转之前或之后执行一些自定义逻辑&#xff0c;例如&#xff1a;鉴权、重定向等。守卫分为全局守卫、路由独享守卫和组件内守卫。 二、全局守卫 全局守卫作用…

Jenkins执行策略(图文讲解)

Jenkins执行策略-图文讲解 一&#xff1a;手动执行1、手动执行流程2、手动执行操作 二、通过构建触发器——定时执行1、定时执行流程2、定时执行操作 三、当开发部署成功之后进行执行——在测试项配置——关注的项目1、执行流程2、操作流程 四、测试代码有更新的时候自动构建1、…

nginx编译安装详细说明

前言 在 CentOS 7 上编译安装 Nginx 1.24.0 &#xff0c;您可以按照以下步骤进行操作。 一、编译前准备 1.1、下载Nginx源代码 下载 Nginx 1.24.0 的源代码压缩包&#xff0c;并解压缩&#xff1a; 访问Nginx官网&#xff08;http://nginx.org/&#xff09;&#xff0c;找…

Kubeflow文档1:介绍与架构

Kubeflow 2024/3/19版本的文档 此专栏用来展示相关的内容翻译&#xff0c;重点关注本地部署&#xff0c;关于运营商的方案&#xff0c;请自行查阅 文档地址https://www.kubeflow.org/docs/ 开始编辑时间&#xff1a;2024/3/27&#xff1b;最后编辑时间2024/3/27 Kubeflow文…

毕设论文目录设置

添加目录 选择一种格式的自动目录 更新目录 发现该目录中只有1、2章&#xff0c;3、4章 然后再点击更新目录 对应的&#xff0c;小标题添加二级目录

数据库之MyBatisPlus详解

MyBatisPlus MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 官网地址&#xff1a;https://baomidou.com/ 一、入门案…