【c++篇】:掌握vector基础知识--基本操作与使用全知道

✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨
✨个人主页:余辉zmh–CSDN博客
✨文章所属专栏:c++篇–CSDN博客

在这里插入图片描述

文章目录

  • 前言
  • 一.vector的基本概念
    • 1.定义
    • 2.主要特性和优点
  • 二.vector的基本操作和使用
    • 1.创建`vector`对象
    • 2.元素访问和迭代器
      • 元素访问
      • 迭代器
    • 3.大小和容量
    • 4.修改元素
      • 插入函数
      • 删除函数

前言

在C++的庞大标准模板库(STL)中,std::vector无疑是最为常用且功能强大的容器之一。它以其高效的内存管理和灵活的动态数组特性,成为了程序员们处理数据的首选工具。无论是初学者还是资深开发者,std::vector都是他们日常编程工作中不可或缺的一部分。在这篇文章中,我们将深入探讨std::vector的基本操作和使用方法。我们将从std::vector的创建和初始化开始,逐步学习如何向std::vector中添加元素、删除元素、访问元素以及进行其他常见操作。希望这篇文章对你的学习有所帮助。

一.vector的基本概念

1.定义

vector是一个能存储任意类型对象的序列容器,这些对象在容器中有序存储,也就是说,vector底层就是顺序表。它允许在序列的末尾快速的增加或删除元素,并支持通过索引直接访问任意位置的元素。vector是模版类,可以存储任意类型的对象,包括自定义类型。

2.主要特性和优点

在C语言中,对于顺序表的处理大多都是使用数组,而c++中则是可以通过使用vector容器达到顺序存储的目的,相较于数组来说,vector使用起来会更加方便。下面将会通过对比传统数组来讲解vector的主要特性和优点。

  • 大小调整:普通数组在声明时需要指定固定的大小,且大小在声明后不可改变。而vector是一种动态数组,它可以根据需要自动调整大小,不需要预先指定固定大小。

  • 内存管理:数组内数据通常存储在栈上,需要手动管理内存空间,包括分配和释放,容易引发内存泄漏或者野指针等问题。而vector中数据存储在堆上,它自动处理内存的分配和释放,减少了内存管理方面的错误。

  • 边界检查:直接使用数组时,程序员需要自己负责确保索引不会越界,否则会导致未定义行为。虽然vector没有内置的边界检查机制,但可以通过迭代器和成员函数如at()进行安全访问。

  • **操作方式:**使用数组时,对于数据的处理通常需要我们自己来手写函数操作,而vector提供了丰富的成员函数,如push_back()insert()erase()size()capacity()等函数,这些函数使用我们对vector的操作标的非常灵活和方便。

二.vector的基本操作和使用

1.创建vector对象

  • 默认构造函数:

    创建一个空的vector对象

    vector<int> v1;
    
  • 填充构造函数:

    • 创建一个指定数量元素的vector对象,每个元素默认值为0

    • //创建一个包含5个整数的vector,每个整数都为0
      vector<int> v2(5);
      
    • 创建一个指定数量和指定数值的vector对象

    • //指定个数为5,指定数值为10
      vector<int> v3(5,10);
      
  • 列表初始化:

    使用初始化列表创建和初始化vector对象

    vector<int> v4={1,2,3,4};
    
  • 复制构造函数:

    • 使用一个已经存在的vector对象拷贝构造一个新的vector对象

    • vector<int> v4={1,2,3,4};
      vector<int> v5(v4);
      
    • 将一个已经存在的vector对象赋值给另一个已存在的对象

    • vector<int> v4={1,2,3,4};
      vector<int> v6;
      v6=v4;
      
  • 使用迭代器范围初始化:

    • 使用另一个容器(数组或vector对象)的迭代器范围来初始化vector对象

    • 使用数组:

      int array[]={1,2,3,4,5};
      vector<int> v7(array,array+5);
      
    • 使用vector:

      vector<int> v4={1,2,3,4,5};
      vector<int> v8(v4.begin(),v4.end());
      
  • 二维vector的创建:

    vector<vector<int>> vv;
    //初始化第一维,大小为5
    vv.resize(5);
    //初始化第二维,每个元素大小为5
    for(size_t i=0;i<vv.size();i++){
        vv[i].resize(5);
    }
    

2.元素访问和迭代器

元素访问

和string一样,同样可以使用下标+[]和at()函数。

  • 下标操作符[]

    • 不进行边界检查,如果访问越界,在debug版本中会触发assert错误,在release版本中可能不会检查错误,导致未定义行为。

    • 示例代码:

      vector<int> v1={1,2,3,4,5};
      //访问下标为2的元素
      int val=v1[2];
      
  • at()函数

    • 与下标操作符不同,at()函数会进行边界检查,如果访问越界,会抛出std::out_of_range异常。

    • 示例代码:

      vector<int> v2={1,2,3,4,5};
      //访问下标为3的元素
      int val=v2.at(3);
      

迭代器

string一样,vector的迭代器同样可以访问和遍历容器中元素。迭代器实质上是一个指向容器中元素的指针,但它比普通的指针更加通用和灵活。

  • 获取迭代器

    • 通过调用vector的成员函数begin()end(),可以获取指向容器第一个元素和最后一个元素之后位置的迭代器。

    • 示例代码:

      vector<int> v1={1,2,3,4,5};
      //获取begin位置的迭代器
      vector<int>::iterator it=v1.begin();
      //获取end位置的迭代器
      vector<int>::iterator rit=v1.end();
      
  • 使用迭代器访问元素

    • 通过解引用迭代器(使用*操作符),可以访问迭代器指向的元素。

    • 示例代码:

      vector<int> v1={1,2,3,4,5};
      //获取begin位置的迭代器
      vector<int>::iterator it=v1.begin();
      //获取end位置的迭代器
      vector<int>::iterator rit=v1.end();
      
      int val1=*it;
      int val2=*(rit-1;
      
  • 遍历容器

    • 通过递增迭代器(使用++操作符),可以遍历整个容器。

    • 示例代码:

      vector<int> v1={1,2,3,4,5};
      vector<int>::iterator it=v1.begin();
      while(it!=v1.end()){
          cout<<*it<<" ";
          it++;
      }
      
      //输出结果:1 2 3 4 5
      

3.大小和容量

  • 大小和容量:

    • size():返回vector对象有效长度(也就是顺序表存储的个数个数)capacity():返回当前分配的存储空间的大小(空间总大小),这个值可能大于或等于size()返回的值。

    • 实例代码:

      vector<int> v1={1,2,3,4,5};
      //输出对象v1的大小和容量
      cout<<v1.size()<<" "<<v1.capacity()<<endl;
      
  • 扩容:

    • reserve(n):如果n大于原容量,更改容量(capacity)为n,小于原本容量时,保持不变,该函数不会改变原本的大小(size),只是确保有足够的空间来存储至少n个元素。

    • 实例代码:

      vector<int> v1={1,2,3,4,5};
      //将v1的容量扩为5
      v1.resize(10);
      
    • resize(n):将vector对象的大小调整为n,如果n大于当前的大小,则用默认元素(通常为0,如果使用reserve(n,m)则是元素m)填充新位置;如果n小于当前vector对象的大小,则发生截断。

    • 实例代码:

      vector<int>v1={1,2,3,4,5,6,7,8};
      //将v1的容量扩大为15,新的空间用数值100填充
      //v1:1,2,3,4,5,6,7,8,100,100,100,100,100,100,100
      v1.resize(15,100)//将v1的容量缩小为5,发生截断
      //v1:1,2,3,4,5
      

4.修改元素

在C++标准库中的vector是一个动态数组,它允许在运行时进行元素的插入和删除。以下是一些常用的插入和删除函数及其用法:

插入函数

  1. push_back

    • 功能:在容器的末尾添加一个元素。

    • 用法:void push_back (const value_type& val)

    • 示例:

      vector<int> v;
      //v中增加元素10
      v.push_back(10);
      
  2. insert

    • 功能:在指定位置插入一个或多个元素。

    • 用法:

      在这里插入图片描述

    • 示例:

      vector<int> vec = {1, 2, 4};
      // 在位置2插入3
      vec.insert(vec.begin() + 2, 3);
      //vec:1,2,3,4
      
      
      vector<int> more = {5, 6};
      // 在末尾插入more中的所有元素
      vec.insert(vec.end(), more.begin(), more.end()); 
      //vec:1,2,3,4,5,6
      

删除函数

  1. erase

    • 功能:删除指定位置的元素或删除指定范围内的元素。

    • 用法:

      在这里插入图片描述

    • 示例:

      std::vector<int> vec = {1, 2, 3, 4, 5};
      // 删除位置2的元素(值为3)
      vec.erase(vec.begin() + 2); 
      //vec:1,2,4,5
      
      
      // 删除前两个元素
      vec.erase(vec.begin(), vec.begin() + 2); 
      //vec:4,5
      
  2. clear

    • 功能:删除容器中的所有元素,使容器变为空。
    • 用法:void clear();
    • 示例:
      vector<int> vec = {1, 2, 3, 4, 5};
      // 删除所有元素
      vec.clear();  
      //vec:空
      
  3. pop_back

    • 功能:删除容器末尾的元素。
    • 用法:void pop_back();
    • 示例:
      vector<int> vec = {1, 2, 3};
      // 删除末尾元素(值为3)
      vec.pop_back(); 
      //vec:1,2
      

这些函数提供了灵活的方式来管理vector中的元素,允许在运行时动态地添加和删除元素。

以上就是关于如何熟练使用vector的讲解,本篇文章主要是简单地认识一下vector,在下一篇模拟实现vector中将会重点对vector进行讲解。最后本篇文章如果哪里有错的话,可以在评论区指正,也欢迎大家一起讨论学习,如果对你的学习有帮助的话,点点赞关注支持一下吧!!!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何建购物网站提升用户体验

在构建一个购物网站时&#xff0c;用户体验是至关重要的&#xff0c;它直接影响到顾客的满意度和转化率。为了提升用户体验&#xff0c;可以从以下几个方面入手。 首先&#xff0c;网站设计应简洁明了。确保导航栏清晰易懂&#xff0c;让用户在寻找商品时不会迷失。此外&#x…

勒索软件如何传播?

在本文中&#xff0c;我们将讨论勒索软件对企业的影响并解释这些攻击的具体传播方式。 我们还将提供可采取的切实步骤来保护您自己和您的企业免受这些不断上升的威胁。 勒索软件对小型企业的攻击日益增多 勒索软件仍然是全球各种规模企业的头号威胁。 小型企业数据泄露的成…

Claude 3.5 新功能 支持对 100 页的PDF 图像、图表和图形进行可视化分析

Claude 3.5 Sonnet发布PDF图像预览新功能&#xff0c;允许用户分析长度不超过100页的PDF中的视觉内容。 此功能使用户能够轻松上传文档并提取信息&#xff0c;特别适用于包含图表、图形和其他视觉元素的研究论文和技术文档。 视觉PDF分析&#xff1a;用户现在可以从包含各种视觉…

交换排序(冒泡/快排)

一 . 交换排序 交换排序基本思想 : 所谓交换 &#xff0c; 就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置 。 交换序列的特点是 &#xff1a; 将键值较大的记录向序列的尾部移动 &#xff0c; 键值较小的记录向序列的前部移动 1.1 冒泡排序 在前面中 …

【反射率】-- Lab 转换(excel)

系列文章目录 文章目录 系列文章目录前言一、CIE1.CIE 简介2.cie 1931标准色度匹配函数数据3.从CIE1931RGB到CIE1931 XYZ 二、Lab颜色空间的理解1.Lab色差公式怎么计算色差 三、D65光源Lab计算总结 前言 一、CIE 1.CIE 简介 CIE是由国际照明工程领域中光源制造、照明设计和光…

[ 问题解决篇 ] win11中本地组策略编辑器gpedit.msc打不开(gpedit.msc缺失)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

c语言素数优化,图解

方法① 2~m-1范围 整体思路就是&#xff0c;整数取余0就break&#xff0c;后续判断取余不为0的i次数&#xff0c;如果到头也就是i值溢出m-1 也就是最后一次循环i都没break&#xff0c;说明全部取余都不为0&#xff0c;贼为素数 尽头 i<m-1 等于号和-1可以抵消&#xff0c; …

跨境电商行业中的主数据有哪些?

在全球化和数字化的推动下&#xff0c;跨境电商行业正迎来前所未有的发展机遇。无论是品牌拓展国际市场还是小型卖家进入全球电商平台&#xff0c;跨境电商企业都需要面对海量数据的管理与整合。在这个行业中&#xff0c;主数据管理尤为重要&#xff0c;因为跨境电商涉及到复杂…

opencv - py_imgproc - py_grabcut GrabCut 算法提取前景

文章目录 使用 GrabCut 算法进行交互式前景提取目标理论演示 使用 GrabCut 算法进行交互式前景提取 目标 在本章中 我们将了解 GrabCut 算法如何提取图像中的前景我们将为此创建一个交互式应用程序。 理论 GrabCut 算法由英国剑桥微软研究院的 Carsten Rother、Vladimir K…

Android编译环境构建(二)(可用于物理机、虚拟机、容器化Jenkins环境)

文章目录 需求环境要求文件下载Gradle Version:7.5cmdline-tools至此普通物理环境的Android编译环境已部署完毕 部署maven(可选)Jenkins配置Android构建环境 说明&#xff1a; 物理环境&#xff1a;物理机、虚拟机等 容器化环境&#xff1a;docker等 需求 Gradle Version:7.5 …

Django安装

在终端创建django项目 1.查看自己的python版本 输入对应自己本机python的版本&#xff0c;列如我的是3.11.8 先再全局安装django依赖包 2.在控制窗口输入安装命令&#xff1a; pip3.11 install django 看到Successflully 说明我们就安装成功了 python的Scripts文件用于存…

【免费】跟网型逆变器小干扰稳定性分析与控制策略优化

目录 主要内容 模型研究 数学模型 2.小信号控制结构 3.仿真模型 结果一览 下载链接 主要内容 弱电网往往具有阻抗较大和短路比较小等特点&#xff0c;易导致系统不稳定&#xff0c;限制了功率传输能力。该仿真建立了弱电网下跟网型逆变器的小信号扰动状态空间模…

aws(学习笔记第十课) 对AWS的EBS如何备份(snapshot)以及使用snapshot恢复数据,AWS实例存储

aws(学习笔记第十课) 对AWS的EBS如何备份&#xff08;snapshot&#xff09;以及使用snapshot&#xff0c;AWS实例存储 学习内容&#xff1a; 对AWS的EBS如何备份AWS实例存储EBS和实例存储的不足 1. 对AWS的EBS如何备份&#xff08;snapshot&#xff09;以及使用snapshot恢复数…

开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序中积分使用价值的拓展策略

摘要&#xff1a;本文围绕开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序&#xff0c;深入探讨其积分使用价值的丰富策略。详细分析积分兑换礼品、会员升级、积分抵现等方式在该特定商城小程序环境下的应用特点、存在问题及对用户和商城的影响&#xff0c;旨在为商城的优化运…

async函数和await表达式

async函数 函数的返回值为promise对象 promise对象的结果由async函数执行的返回值决定 async函数的返回值 和then方法的返回值以及返回类型的判断办法一致 如果返回值是一个非promise类型的数据 返回的promise的类型为fulfilled或者resolved 如果返回的是一个promise对象 …

软件测试--BUG篇

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 目录 1. 软件测试的⽣命周期 2. BUG 1. BUG 的概念 2. 描述bug的要素 3.bug级别 4.bug的⽣命周期 5 与开发产⽣争执怎…

Linux云计算 |【第五阶段】CLOUD-DAY8

主要内容&#xff1a; 掌握DaemonSet控制器、污点策略&#xff08;NoSchedule、Noexecute&#xff09;、Job / CronJob资源对象、掌握Service服务、服务名解析CluterIP&#xff08;服务名自动发现&#xff09;、&#xff08;Nodeport、Headless&#xff09;、Ingress控制器 一…

基于java+SpringBoot+Vue的新闻推荐系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

我主编的电子技术实验手册(22)——RC并联电路

本专栏是笔者主编教材&#xff08;图0所示&#xff09;的电子版&#xff0c;依托简易的元器件和仪表安排了30多个实验&#xff0c;主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】&#xff0c;精心设计的【实验步骤】&#xff0c;全面丰富的【思考习…

设备树基本语法

文章目录 设备树基本语法跟节点子节点reg属性address-cells 和 size-cells 属性model 属性status 属性compatible 属性aliases 节点chosen 节点device_type 节点自定义属性 当描述设备树&#xff08;Device Tree&#xff09; 时&#xff0c; 通常会涉及到以下几个关键术语&…