【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,4vector<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进行讲解。最后本篇文章如果哪里有错的话,可以在评论区指正,也欢迎大家一起讨论学习,如果对你的学习有帮助的话,点点赞关注支持一下吧!!!

在这里插入图片描述

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

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

相关文章

windows C#-对象

类或结构定义的作用类似于蓝图&#xff0c;指定该类型可以进行哪些操作。 从本质上说&#xff0c;对象是按照此蓝图分配和配置的内存块。 程序可以创建同一个类的多个对象。 对象也称为实例&#xff0c;可以存储在命名变量中&#xff0c;也可以存储在数组或集合中。 使用这些变…

基于SSM+微信小程序的订餐管理系统(点餐2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的订餐管理系统实现了管理员和用户。管理端实现了 首页、个人中心、用户管理、菜品分类管理、菜品信息管理、订单信息管理、配送信息管理、菜品评价管理、订单投诉管理、…

基于Opencv的图像处理软件

本文所涉及所有资源均在 传知代码平台 可获取。 目录 一、背景及意义介绍 背景 意义

机器学习周报(RNN的梯度消失和LSTM缓解梯度消失公式推导)

文章目录 摘要Abstract 1 RNN的梯度消失问题2 LSTM缓解梯度消失总结 摘要 在深度学习领域&#xff0c;循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;被广泛应用于处理序列数据&#xff0c;特别是在自然语言处理、时间序列预测等任务中。然而&#xff0c…

equal和==的比较

equal是一个方法&#xff0c;用于比较两个对象的值是否相等。 是一个运算符&#xff0c;用于比较两个对象的引用是否相等。 在Java中&#xff0c;对于基本数据类型&#xff0c;用于比较它们的值是否相等。而对于引用类型&#xff0c;比较的是对象的引用是否相等&#xff0c;即…

Mastercam2025软件安装教程+MC2025中文安装包下载

一、软件下载 【软件名称】&#xff1a;MasterCAM 2025 【支持系统】&#xff1a;win10/win11 【百度网盘】&#xff1a;https://pan.baidu.com/s/12fY66cwRLGcKdeVoJ40ZRw?pwd70zi 二、Mastercam软件 Mastercam是美国 CNC Software 公司开发的一款 CAD/CAM 软件。它集二维…

[vulnhub] DC: 8

https://www.vulnhub.com/entry/dc-8,367/ 描述&#xff1a;在 Linux 上安装和配置双因素身份验证是否可以防止 Linux 服务器被利用 端口扫描主机发现 探测存活主机&#xff0c;179是靶机 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.or…

【Rust标准库中的convert(AsRef,From,Into,TryFrom,TryInto)】

Rust标准库中的convert&#xff08;AsRef&#xff0c;From&#xff0c;Into&#xff0c;TryFrom&#xff0c;TryInto&#xff09; 为什么需要convert库AsRef&#xff08;不可变引用&#xff1a;多用于内部字段获取值&#xff09;From/Into Trait | TryFrom/TryInto TraitFrom T…

自扶正救生艇,保障水上救援的安全卫士_鼎跃安全

在应急事件中&#xff0c;自扶正救生艇能够发挥关键的救援和保障作用&#xff0c;确保救援人员和被困人员的生命安全&#xff0c;尤其在极端天气或突发水上事故中展现出明显优势。 在救援过程中如果遭遇翻船&#xff0c;救生艇能够迅速恢复正常姿态&#xff0c;确保救援人员不会…

提升网站安全性 HTTPS的重要性与应用指南

内容概要 在如今数字化快速发展的时代&#xff0c;网站安全显得尤为重要。许多用户在访问网站时&#xff0c;尤其是涉及个人信息或金融交易时&#xff0c;对数据传输的安全性有着高度的关注。HTTPS&#xff08;超文本传输安全协议&#xff09;正是为了满足这种需求而诞生的。通…

QT——自定义控件绘图

一.QPaintEvent绘图事件 QPaintEvent是QT中一个重要的类&#xff0c;专门用于绘图事件。当QT视图组件需要重绘制自己的一部分时&#xff0c;就会产生该事件&#xff0c;通常发生在以下几种情况。 窗口第一次显示时&#xff1a;当窗口或控件第一次出现在屏幕中&#xff0c;系统…

【jvm】Minor GC

目录 1. 说明2. JVM内存结构2.1 年轻代2.2 老年代2.3 永久代/元空间 3. 工作原理4. 触发条件5. 影响6. 优化策略 1. 说明 1.minor是较小的、较少的、次要的含义。2.在Java虚拟机中&#xff0c;Minor GC是指针对于年轻代&#xff08;Young Generation&#xff09;进行的垃圾回收…

【Python · Pytorch】人工神经网络 ANN(上)

【Python Pytorch】人工神经网络 ANN&#xff08;上&#xff09; 0. 生物神经网络1. 人工神经网络定义2. 人工神经网络结构2.1 感知机2.2 多层感知机2.3 全连接神经网络2.4 深度神经网络 2. 训练流程※ 数据预处理 (Data Preprocessing) 3. 常见激活函数3.1 Sigmoid / Logisti…

【Redis_Day2】在Linux中安装Redis5

本篇涉及Linux中的三条指令&#xff1a;su&#xff1b;apt&#xff1b;vim&#xff0c;可以了解后再来浏览本篇。或在评论留言。 【Redis_Day2】在Linux中安装Redis5 安装修改配置文件使用redis-cli连接服务器 安装 Linux版本选择Ubuntu22.04 Redis版本选择Redis5 登录Ubunt…

第1篇 引言

一、AIGC概念 1、AIGC定义 AIGC&#xff0c;即生成式人工智能&#xff08;Artificial Intelligence Generated Content&#xff09;&#xff0c;是指利用人工智能技术自动生成或辅助创作内容的过程和结果。 简单来说&#xff1a;过去&#xff0c;写文章、画张图、唱首歌、弄个…

深度学习---------------------------------Transformer

目录 Transformer架构多头注意力有掩码的多头注意力基于位置的前馈网络层归一化信息传递预测总结代码多头注意力使用多个头并行计算选择缩放点积注意力作为每一个注意力头测试该部分总代码Transformer基于位置的前馈网络改变张量的最里层维度的尺寸对比不同维度的层归一化和批量…

世界时区划分

1. AoE &#xff08;Anywhere on Earth&#xff09;代表地球上最后一个时区的时间&#xff0c;是全球范围内最晚的时间&#xff0c;通常用于截止日期。 2. UTC/GMT &#xff08;协调世界时/格林威治时间&#xff09;是全球的标准时间&#xff0c;所有时区都是基于UTC计算的。…

qt QImage详解

1、概述 QImage是Qt框架中用于处理图像数据的一个核心类。与QPixmap不同&#xff0c;QImage是在内存中直接存储图像像素数据的&#xff0c;这使得它适用于需要直接访问和修改像素的应用场景&#xff0c;比如图像处理算法、图像绘制以及图像分析等。QImage支持多种图像格式&…

将分类标签转换为模型可以处理的数值格式

将分类标签转换为模型可以处理的数值格式是数据预处理的关键步骤&#xff0c;尤其是在处理监督学习任务时。以下是几种常用的方法&#xff0c;每种方法都有其特点和适用场景&#xff1a; 1. Label Encoding&#xff08;标签编码&#xff09; 原理&#xff1a; 标签编码将每个…

DAY75WEB 攻防-验证码安全篇接口滥用识别插件复用绕过宏命令填入滑块类

知识点&#xff1a; 1、验证码简单机制-验证码过于简单可爆破 2、验证码重复使用-验证码验证机制可绕过 3、验证码智能识别-验证码图形码被可识别 4、验证码接口调用-验证码触发接口可枚举 图片验证码-识别插件-登录爆破&接口枚举 验证码识别绕过等技术适用于&#x…