48.C++ vector容器(模板类)

news2024/12/26 23:24:13

今天学习了C++中的vector容器,它提供动态数组功能,方便管理和存储数据。支持动态调整大小,简化了数组操作,使代码更灵活、高效。实在是太牛了,后悔没有早点学习容器。

目录

一、vector简介

二、头文件和命名空间 

三、vector的基本用法 

(1)初始化

(2)访问元素

 (3)遍历所有元素

 (4)添加元素

四、vector和数组的区别 


一、vector简介

        数组尽管很灵活,但使用起来还是很多不方便。为此,C++语言定义了扩展的“抽象数据类型”,放在“标准库”中。

        对数组功能进行扩展的一个标准库类型,就是“容器”vector。顾名思义,vector“容纳”着一堆数据对象,其实就是一组类型相同的数据对象的集合。

std::vector 是 C++ 标准库提供的一个动态数组容器,用于存储一系列连续的元素。

二、头文件和命名空间 

        vector是标准库的一部分。要想使用vector,必须在程序中包含<vector>头文件,并使用std命名空间。 

#include <vector>
using namespace std;

        在vector头文件中,对vector这种类型做了定义;使用#include引入它之后,并指定命名空间std之后,我们就可以在代码中直接使用vector了。

三、vector的基本用法 

        vector其实是C++中的一个“类模板”,是用来创建类的“模子”。所以在使用时还必须提供具体的类型信息,也就是说,这个容器中到底要容纳什么类型的数据对象;具体的形式是在vector后面跟一个尖括号<>,里面填入具体类型信息。

#include <vector>
using namespace std;

vector<int> v1;

(1)初始化

#include <iostream>
#include <vector>
using namespace std;

int main() {
	// 默认初始化,不含任何元素
	vector<int> v1;
	// 列表初始化
	vector<char> v2 = { 'a', 'b', 'c' };
	// 省略等号的列表初始化
	vector<short> v3{1, 2, 3, 4, 5};

	// 只定义长度,元素初值默认初始化,容器中有5个0
	vector<int> v4(5);
	// 定义长度和初始值,容器中有5个100
	vector<long> v5(5, 100);

	return 0;
}

这里有几种不同的初始化方式:

  1. 默认初始化一个vector对象,就是一个空容器,里面不含任何元素;
  2. C++ 11之后可以用花括号括起来的列表,对vector做初始化;等号可以省略;这种方式是把一个列表拷贝给了vector,称为“拷贝初始化”
  3. 可以用小括号表示初始化vector的长度,并且可以给所有元素指定相同的初始值;这种方式叫做“直接初始化”

(2)访问元素

同样可以用下标操作符来获取对应索引的元素,这一点跟数组非常相似。

需要注意:

  1. vector内元素的索引,也是从0开始;
  2. vector索引最大值为 (vector长度 - 1),不能越界访问;如果直接越界访问并赋值,有可能导致非常严重的后果,出现安全问题

 (3)遍历所有元素

        vector中有一个可以调用的函数size(),只要调用它就能直接得到vector的长度(即元素个数):

        调用的方式是一个vector对象后面跟上一个点,再跟上size()。这种基于对象来调用的函数叫做“成员函数”。

 (4)添加元素

vector的长度并不是固定的,所以可以向一个定义好的vector添加元素。

        这里的push_back同样是一个成员函数,调用它的时候在小括号里传入想要添加的数值,就可以让vector对象中增加一个元素了。

        这就使得我们在创建vector对象时不需要知道元素个数,使用更加灵活,避免了数组中的缺陷。

四、vector和数组的区别 

  1. 大小调整:

    • 数组:数组的大小在创建时就确定了,后续无法改变,即静态大小。如果需要调整数组大小,需要重新创建一个新的数组并拷贝数据。
    • vector:vector 的大小是动态调整的,可以根据需要随时增加或减少元素,即动态大小。vector 会自动处理内部的内存管理,避免了手动重新分配内存的麻烦。
  2. 内存管理:

    • 数组:数组在栈上分配内存,通常具有较小的容量。对于大型数组,可能会导致栈溢出,因此通常使用堆内存动态分配。
    • vector:vector 在堆上分配内存,可以存储更大量的数据,并且自动处理内存管理,不需要手动释放内存。
  3. 增删元素的效率:

    • 数组:在数组中插入或删除元素比较低效,因为需要移动其他元素来填补空位。
    • vector:vector 的插入和删除元素的操作相对高效,特别是在尾部进行插入和删除操作。但在中间或头部进行插入和删除,仍然涉及元素的移动。
  4. 参数传递:

    • 数组:数组作为函数参数传递时,通常会退化为指针,丧失了长度信息,需要额外传递数组长度参数。
    • vector:vector 可以作为函数参数传递,它包含了自身的长度信息,无需额外传递大小。
  5. STL功能:

    • 数组:C++ 原生数组不是标准库的一部分,没有提供丰富的容器功能。
    • vector:vector 是 C++ 标准库提供的容器,拥有丰富的操作函数,可以方便地进行元素访问、插入、删除等操作。

综上所述,vector 相对于数组来说更加灵活和方便,特别适用于需要动态管理大小和使用丰富容器功能的场景。而数组则更适用于静态大小和对内存管理有特殊要求的情况。

在学习和使用std::vector这个强大的C++容器时,我深刻体会到其灵活性和便利性。std::vector能够动态调整大小、支持随机访问,简化了数组操作和内存管理。它在各种场景下都发挥着重要的作用,让我们】在编程的世界中更加得心应手。

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

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

相关文章

该你出手了!华为云PaaS服务 8月线上开发者活动指南——技术提升、合作交流、创新无限!

天高云阔、风朗气清 亲爱的开发者们&#xff0c;8月已经来临 你们准备好迎接一个充满激情和挑战的月份了吗&#xff1f; 如果你对编程充满热情&#xff0c;对技术前沿有所追求 那么华为云PaaS为各位开发者准备的这些8月活动&#xff0c;你一定不能错过。 为了让开发者们更好…

集睿致远/CS5269设计Typec转HDMI带PD100w快充方案

集睿致远ASL推出的CS5269AN是一款高性能Typec/DP1.4转HDMI 4k_60Hz带PD100w快充转换器方案芯片 DP接口包括4条主通道、辅助通道和HPD信号。支持5.4Gbps(HBR2&#xff09;的数据速率。DP接收机兼容HDCP1.4和HDCP2.3内容保护方案具有嵌入式密钥&#xff0c;用于数字音视频内容的…

【源码分析】Nacos如何使用AP协议完成服务端之间的数据同步?

AP节点的同步使用的是异步任务消息队列的方式来实现的。 取出任务之后将会放入到一个List集合中。 然后会发现任务的执行是由条件的。 首先是当前集群的节点数量等于1000&#xff0c;那么此时会直接开始同步&#xff0c;当然这个条件在小项目中不会成立&#xff0c;所以还有…

BIO,NIO,AIO总结

文章目录 1. BIO (Blocking I/O)1.1 传统 BIO1.2 伪异步 IO1.3 代码示例 1.4 总结2. NIO (New I/O)2.1 NIO 简介2.2 NIO的特性/NIO与IO区别1)Non-blocking IO&#xff08;非阻塞IO&#xff09;2)Buffer(缓冲区)3)Channel (通道)4)Selector (选择器) 2.3 NIO 读数据和写数据方式…

python-opencv对极几何 StereoRectify

OpenCV如何正确使用stereoRectify函数 函数介绍 用于双目相机的立体校正环节中&#xff0c;这里只谈谈这个函数怎么使用&#xff0c;参数具体指哪些函数参数 随便去网上一搜或者看官方手册就能得到参数信息&#xff0c;但是&#xff01;&#xff01;相对关系非常容易出错&…

MySQL体系结构

连接层&#xff1a; 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层&#xff1a; 第二层架构主要完成大多数的核心服务功能&#xff0c;如…

【从零学习python 】02. 开发工具介绍

文章目录 编写Python代码一、常见的代码编辑工具二、运行Python程序三、Pycharm的下载和安装PyCharm的主要功能区域进阶案例 编写Python代码 根据我们之前介绍的知识&#xff0c;我们知道&#xff0c;所谓代码其实就是将一段普通文本按照一定的规范编写&#xff0c;然后交给电…

微信提示操作太频繁怎么办?

微信使用过程中&#xff0c;遇到“操作太频繁”的提示该怎么办&#xff1f; 而提示频繁最常见的两种情况&#xff1a;加好友频繁和发消息频繁。 微信为什么提示频繁&#xff1f;频繁是因为微信故意这样设置的&#xff0c;压根就不想你群发&#xff01;&#xff01;&#xff0…

《Zookeeper》从零开始学Zookeeper源码(三)之服务器的启动过程

目录 QuorumPeerMain QuorumPeerMain 在搭建本地的源码环境中&#xff0c;启动zookeeper服务端的入口为QuorumPeerMain&#xff0c;先看下它的类结构&#xff1a; 它本身只有一个属性quorumPeer&#xff0c;它代表了zookeeper集群中的一台机器&#xff0c;它会不断检测当前服…

营销文案流水线化生产——agent llm

背景&#xff1a; 做过工厂生产的朋友应该对生产流程&#xff1a;BOM、SOP这两个词不陌生&#xff0c;然而这两个词更厉害的地方在于标准化流程化作业。其实经过这么多轮迭代的内容生成&#xff0c;特别是和商业营销相关的数字化内容生成和其不是在追求标准化、流程化、定制化…

某大型医院门户网站性能分析案例

故障现象 门户网站近期出现少量的访问体验慢现象&#xff0c;主要是由于服务器响应时间慢。出现慢页面的页面簇为&#xff1a;http://www.xxx.ac.cn/。 分析过程 下面将分析异常原因:页面的URL信息&#xff1f;页面慢的原因&#xff1f; 性能问题分析&#xff0c;定位到慢访…

知识付费系统开发:构建高效智能的付费内容平台

随着数字化时代的来临&#xff0c;知识付费正迅速崭露头角&#xff0c;为知识创作者和求知者带来了全新的商机。在这个背景下&#xff0c;开发一款高效智能的知识付费系统成为了一项重要的任务。本文将深入探讨如何基于Python编程语言和相关技术构建一个智能的知识付费内容平台…

kconfig语法

前言 Kconfig文件&#xff1a;存放生成基于图形化界面内容 学习原因&#xff1a;Kconfig是各种配置界面的源文件&#xff0c;内核的配置工具读取各个Kconfig文件&#xff0c;生成配置界面供开发人员配置内核&#xff0c;最后生成配置文件.config 语法 1.概念&#xff1a;主…

【51单片机】晨启科技,7针OLED显示驱动程序,STC89C52RC

文章目录 原理图oled.coled.hmain.c 原理图 sbit OLED_SCLP4^3;//SCL-D0 sbit OLED_SDAP4^1;//SDA-D1 sbit OLED_RES P3^6;//RES sbit OLED_DC P3^7;//DC sbit OLED_CSP2^7; //CS oled.c #include "OLED.h"//******************************说明*******************…

【gavh39芯片用什么代替-AH8652】

问&#xff1a;gavh39芯片用什么代替&#xff1f; 答&#xff1a;gavh39是一颗用于交流220v转5v输出的芯片&#xff0c;它的拼对拼代替型号为AH8652 AH8652是一款非隔离电源管理芯片&#xff0c;它用于将交流电压转换为直流电压输出。可以将输入的220V交流电转换为输出的5V直流…

Harbor企业镜像仓库部署(本地)

简述&#xff1a; Docker 官方镜像仓库是用于管理公共镜像的地方&#xff0c;大家可以在上面找到想要的镜像&#xff0c;也可以把自己的镜像推送上去。但是有时候服务器无法访问互联网&#xff0c;或者不希望将自己的镜像放到互联网上&#xff0c;那么就需要用到 Docker Regis…

Docker desktop使用配置

1. 下载安装 https://www.docker.com/ 官网下载并安装doker desktop 2. 配置镜像 &#xff08;1&#xff09;首先去阿里云网站上进行注册&#xff1a;https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors &#xff08;2&#xff09;注册完成后搜索&#xff1a;容…

用 docker 创建 jmeter 容器,能做性能测试?

我们都知道&#xff0c;jmeter 可以做接口测试&#xff0c;也可以用于性能测试&#xff0c;现在企业中性能测试也大多使用 jmeter。docker 是最近这些年流行起来的容器部署工具&#xff0c;可以创建一个容器&#xff0c;然后把项目放到容器中&#xff0c;就可以构建出一个独立的…

独立站私域怎么玩?浅浅了解一下吧!

当你是一个跨境电商独立站的卖家&#xff0c;你的工作有三个主要焦点&#xff1a;充分利用流量、提升用户转化率和降低用户的总体成本。 然而&#xff0c;除了利用广告以外&#xff0c;是否有更多的策略可以帮助你接触到用户&#xff0c;同时降低吸引新用户的成本呢&#xff1…

LeetCode150道面试经典题-合并两个有序数组(简单)

合并两个有序数组 题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&a…