STL —— vector(1)

图片名称

博主首页: 有趣的中国人

专栏首页: C++专栏


    本篇文章主要讲解vector使用的相关内容

    1. vector简介

    vector 是 C++ 标准库中的一个容器类模板,它提供了动态数组的功能,可以方便地管理和操作元素的集合。下面是关于 vector 的一些基本信息:

    • 头文件: vector 定义在 头文件中,使用时需要包含该头文件。
    • 使用命名空间: vector 类定义在 std 命名空间中,因此需要使用 std::vector 或者在代码开头添加 using namespace std; 来简化使用。
    • 容器特点: vector 是一个序列式容器,它以动态数组的形式存储元素,并提供了在数组末尾快速插入和删除元素的功能。
    • 元素类型: vector 可以存储几乎任何类型的元素,例如整数、浮点数、对象或其他容器,只要这些类型满足一定的要求,例如可移动构造函数和析构函数等。
    • 动态大小: vector 允许动态分配和释放内存,可以根据需要动态调整大小,而无需手动管理内存。
    • 访问元素: 可以使用下标运算符 [] 或者 at() 方法访问 vector 中的元素。
    • 插入和删除: 可以使用 push_back() 方法将元素插入到 vector的末尾,使用 pop_back() 方法删除末尾的元素,还可以使用 insert() 方法在指定位置插入元素,使用 erase() 方法删除指定位置的元素。
    • 动态调整大小: 可以使用 resize() 方法动态调整 vector 的大小,增加或减少元素数量,还可以使用 reserve() 方法预留一定的容量,避免频繁的重新分配内存。
    • 遍历元素: 可以使用迭代器或者基于范围的 for 循环遍历 vector 中的元素。
    • 其他操作: vector 还提供了许多其他有用的方法,例如获取大小、判断是否为空、清空容器、交换容器等。

    vector 是 C++ 中常用的容器之一,它提供了灵活且高效的动态数组功能,适用于各种场景和用途。


      3. vector iterator 的使用

      类似的,vector的迭代器也分为正向和反向,const和非const,即

      • iterator
      • reverse_iterator
      • const_iterator
      • const_reverse_iterator

      1. iterator 示例
      void vector_test2()
      {vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;it = v.begin();// 可修改while (it != v.end()){++*it;++it;}it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;}
      
      1. reverse_iterator 示例
      void vector_test3()
      {vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);vector<int>::reverse_iterator it = v.rbegin();while (it != v.rend()){cout << *it << " ";++it;}cout << endl;it = v.rbegin();while (it != v.rend()){++*it;++it;}it = v.rbegin();while (it != v.rend()){cout << *it << " ";++it;}cout << endl;
      }
      
      1. const_iterator 示例
      void vector_test4()
      {const vector<int> v(10,10);vector<int>::const_iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;// 不可修改/*it = v.begin();while (it != v.end()){++*it;++it;}*/
      }
      
      1. const_reverse_iterator 示例
      void vector_test5()
      {const vector<int> v(10, 66);vector<int>::const_reverse_iterator it = v.rbegin();while (it != v.rend()){cout << *it << " ";++it;}cout << endl;
      }
      

        3. vector 容量操作

        3.1 vector 空间增长问题

        对于 vector 的容量操作,重点有以下几个:

        • size
        • capacity
        • empty
        • resize


        可以用以下代码查看 vector 的空间增长

        void TestVectorExpand()
        {size_t sz;vector<int> v;sz = v.capacity();cout << "making v grow:\n";for (int i = 0; i < 100; ++i){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed: " << sz << '\n';}}
        }
        


        vs下使用的STL基本是按照1.5倍方式扩容。

        3.2 reserve 提前预留空间

        我们知道频繁扩容会对效率大大提高,因此当我们知道需要使用多少空间的时候,应当提前预留空间,用 reserve 函数即可。

        void TestVectorExpand()
        {size_t sz;vector<int> v;sz = v.capacity();v.reserve(100); // 提前将容量设置好,可以避免一遍插入一遍扩容cout << "making v grow:\n";for (int i = 0; i < 100; ++i){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed: " << sz << '\n';}}
        }
        

        3.3 size()、capacity()、resize()

        void vector_test6()
        {vector<int> v(100, 66);cout << v.size() << endl;cout << v.capacity() << endl;// 不会缩容v.resize(50);cout << v.capacity() << endl;// 按照内存对齐的方式给空间v.resize(120);cout << v.size() << endl;cout << v.capacity() << endl;
        }
        

          4.vector 的增删改查


          注意这里的insert() 有三种重载形式,而且在算法库

          iterator insert(iterator pos, const T& value);
          iterator insert(iterator pos, size_type count, const T& value);
          iterator insert(iterator pos, InputIterator first, InputIterator last);

          • pos 是插入的位置,类型为迭代器,表示插入元素的位置。
          • value 是要插入的元素值。
          • count 是要插入的元素个数。
          • first 和 last 是迭代器范围,表示要插入的元素序列的起始和结束位置。
          void vector_test7()
          {vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (auto e : v){cout << e << " ";}cout << endl;//vector<int>::iterator pos = find(v.begin(), v.end(), 3);auto pos = find(v.begin(), v.end(), 3);if (pos != v.end()){v.insert(pos, 30);}// 头插v.insert(v.begin(), 0);for (auto e : v){cout << e << " ";}cout << endl;v.insert(v.begin() + 2, 0);for (auto e : v){cout << e << " ";}cout << endl;string s("abcd");v.insert(v.begin(), s.begin(), s.end());for (auto e : v){cout << e << " ";}cout << endl;
          }
          

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

          如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

          相关文章

          NRF24L01P和SI24R1的区别

          NRF24L01无线模块广泛地运用于&#xff1a;无线门禁、无线数据通讯、安防系统、遥控装置、遥感 勘测、智能运动设备、工业传感器&#xff1b;平常我们用到的无线鼠标基本上采用的都是NORDIC的N RF24L01无线模块方案&#xff0c;而且&#xff0c;只需要一个5号电池即可。 几年前…

          HarmonyOS实战开发-如何实现一个自定义抽奖圆形转盘

          介绍 本篇Codelab是基于画布组件、显式动画&#xff0c;实现的一个自定义抽奖圆形转盘。包含如下功能&#xff1a; 通过画布组件Canvas&#xff0c;画出抽奖圆形转盘。通过显式动画启动抽奖功能。通过自定义弹窗弹出抽中的奖品。 相关概念 Stack组件&#xff1a;堆叠容器&am…

          详解TCP的三次握手和四次挥手

          文章目录 1. TCP报文的头部结构2. 三次握手的原理与过程三次握手连接建立过程解析 3. 四次挥手的原理与过程四次挥手连接关闭过程的解析 4. 常见面试题 深入理解TCP连接&#xff1a;三次握手和四次挥手 在网络通信中&#xff0c;TCP&#xff08;传输控制协议&#xff09;扮演着…

          人才推荐 | 材料化学博士,热衷于创新且可扩展的电池技术开发

          编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态&#xff0c;用科技解决职业领域问题&#xff0c;提升行业数字化服务水平&#xff0c;提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

          java多线程——概述,创建方式及常用方法

          前言&#xff1a; 学习到多线程了&#xff0c;整理下笔记&#xff0c;daydayup!!! 多线程 什么是线程 线程&#xff08;Thread&#xff09;是一个程序内部的一条执行流程。若程序只有一条执行流程&#xff0c;那这个程序就是单线程的程序。 什么是多线程 多线程是指从软硬件上…

          【AIGC】如何在Windows/Linux上部署stable diffusion

          文章目录 整体安装步骤windows10安装stable diffusion环境要求安装步骤注意事项参考博客其他事项安装显卡驱动安装cuda卸载cuda安装对应版本pytorch安装git上的python包Q&A linux安装stable diffusion安装anaconda安装cudagit 加速配置虚拟环境挂载oss&#xff08;optional…

          传播力研究期刊投稿发表

          《传播力研究》杂志是经国家新闻出版总署批准&#xff0c;黑龙江日报报业集团主管主办&#xff0c;面向全国公开发行的学术刊物。本刊为新闻、传媒、传播学类专业院校师生、文化传播理论研究者和从业人员及爱好者&#xff0c;开展学术交流与研讨&#xff0c;汲取当今业界新鲜的…

          RGB,深度图,点云和体素的相互转换记录

          目录 1.RGBD2Point 1.2 步骤 2.Point2Voxel-Voxelization 2.1 原理 2.2 代码 3.Voxel2Point 4.Point2RGB 5.Voxel2RGB 1.RGBD2Point input&#xff1a;RGB D 内外惨 output&#xff1a;points cloud def depth2pcd(depth_img):"""深度图转点云数据图…

          翻译 《The Old New Thing》 - Why is a registry file called a “hive“?

          Why is a registry file called a “hive“?https://devblogs.microsoft.com/oldnewthing/20030808-00/?p42943 为什么注册表文件被称为‘蜂巢’&#xff1f; Raymond Chen 2003年8月8日 分享一个没用的知识&#xff1a; 话说有一位 Windows NT 的开发者十分讨厌蜜蜂。于是&a…

          FLV流媒体封装格式

          1、FLV 简介 FLV(Flash Video) 是 Adobe 公司推出的一种流媒体格式&#xff0c;由于其封装后的音视频文件体积小、封装简单等特点&#xff0c;非常适合于互联网上使用。目前主流的视频网站基本都支持FLV。采用 FLV 格式封装的文件后缀为.flv。直播场景下拉流比较常见的是 http-…

          计算机网络:现代通信的基石

          &#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

          小白了解Pinia第2集 · 三大核心状态Getters、Actions以及Plugins 插件

          三大核心状态 state 第1集有详细讲解&#xff1a;https://blog.csdn.net/qq_51463650/article/details/137137080?spm1001.2014.3001.5501 getters Getter 完全等同于 Store 状态的 计算值。 它们可以用 defineStore() 中的 getters 属性定义。 他们接收“状态”作为第一个…

          Elastic 8.13:Elastic AI 助手中 Amazon Bedrock 的正式发布 (GA) 用于可观测性

          作者&#xff1a;来自 Elastic Brian Bergholm 今天&#xff0c;我们很高兴地宣布 Elastic 8.13 的正式发布。 有什么新特性&#xff1f; 8.13 版本的三个最重要的组件包括 Elastic AI 助手中 Amazon Bedrock 支持的正式发布 (general availability - GA)&#xff0c;新的向量…

          汽车电子行业知识:什么是智能驾驶辅助系统(ADAS)

          文章目录 1. 什么是智能驾驶辅助系统&#xff08;ADAS&#xff09;1.1 ADAS的功能1.2 ADAS的优势1.3 未来发展趋势 2. ADAS等级2.1. 0级驾驶辅助2.2. 1级驾驶辅助2.3. 2级驾驶辅助2.4. 3级驾驶辅助2.5. 4级和5级驾驶辅助 3. 智能车4. ADAS供应商 1. 什么是智能驾驶辅助系统&…

          文章分享:协和文章《病原宏基因组高通量测序性能确认方案》

          摘要&#xff1a;宏基因组学利用新一代高通量测序技术&#xff0c;以特定环境下病原体基因组为研究对象&#xff0c;在分析病原体多样性、种群结构、进化关系的基础上&#xff0c;进一步探究病原体的群体功能活性、相互作用及其与环境之间的关系&#xff0c;发掘潜在的生物学意…

          STM32之HAL开发——串口配置(CubeMX)

          串口引脚初始化&#xff08;CubeMX&#xff09; 选择RCC时钟来源 选择时钟频率&#xff0c;配置为最高频率72MHZ 将单片机调试模式打开 SW模式 选择窗口一配置为异步通信模式 点击IO口设置页面&#xff0c;可以看到当前使用的串口一的引脚。如果想使用复用功能&#xff0c;只需…

          每天五分钟深度学习:使用神经网络完成人脸的特征点检测

          本文重点 我们上一节课程中学习了如何利用神经网络对图片中的对象进行定位,也就是通过输出四个参数值bx、by、bℎ和bw给出图片中对象的边界框。 本节课程我们学习特征点的检测,神经网络可以通过输出图片中对象的特征点的(x,y)坐标来实现对目标特征的识别,我们看几个例子。…

          前端发版上线出现白屏问题

          目录 路由配置问题资源缓存问题首屏加载过慢 &#xff1a;喂&#xff0c;你的页面白啦&#xff01; 出现上线白屏的问题有很多&#xff0c;如&#xff1a;配置错误、缓存问题、浏览器兼容问题&#xff0c;根据不同情况去解决。 路由配置问题 问题描述&#xff1a; 在vue开发…

          C语言中的联合体和枚举

          联合体 联合体的创建 联合体的关键字是union union S {char a;int i; };除了关键字和结构体不一样之外&#xff0c;联合体的创建语法形式和结构体的很相似&#xff0c;如果不熟悉结构体的创建&#xff0c;可以看一下我上一篇的博客关于结构体知识的详解。 联合体的特点 联合…

          HarmonyOS 应用开发之进程模型

          系统的进程模型如下图所示。 应用中&#xff08;同一Bundle名称&#xff09;的所有UIAbility、ServiceExtensionAbility和DataShareExtensionAbility均是运行在同一个独立进程&#xff08;主进程&#xff09;中&#xff0c;如下图中绿色部分的“Main Process”。应用中&#x…