深入理解C++中的Vector容器:用容器构建高效程序
文章目录
- vector介绍
- vector常用的成员函数
- 有关vector定义的函数
- vector的迭代器使用
- vector关于空间操作的成员函数
- vector的增删查改
- 总结
vector介绍
在C++语言的库中包含有公共数据结构的实现,C++的这个部分内容就是众所周知的STL(标准模版库),vector就是标准模板库中的数据结构之一。
vector常用的成员函数
有关vector定义的函数
| 函数声明 | 说明 |
|---|---|
| vector() | 无参构造 |
| vector(size_type n, const value_type& val = value_type()) | 构造并初始化n个val |
| vector (const vector& x); | 拷贝构造 |
| vector (InputIterator first, InputIterator last); | 使用迭代器进行初始化构造 |
无参构造
void test_vector1()
{vector<int> v1();
}
构造n个val
void test_vector2()
{vector<int> v2(10, 1);
}
拷贝构造
void test_vector3()
{vector<int> v1{ 1,2,3,4 };vector<int> v2 = v1;for (int i = 0;i < v2.size();i++){cout << v2[i] << ' ';}
}
迭代器构造
void test_vector4()
{vector<int> v1{ 1,2,3,4 };vector<int> v2(v1.begin(), v1.end());for (int i = 0;i < v2.size();i++){cout << v2[i] << ' ';}
}
vector的迭代器使用
| iterator的使用 | 说明 |
|---|---|
| begin+end | 返回指向容器的第一项的一个适当的迭代器和返回指向终止标志的一个迭代器 |
| rbegin+rend | 和begin和end类似,但是需要用reverse_iterator获取其迭代器 |
begin+end
使用场景:遍历容器
第一种遍历方式
void test_vector5()
{vector<int> v1{ 1,2,3,4 };vector<int>::iterator it = v1.begin();while (it != v1.end()){cout << *it << ' ';it++;}
}
第二种遍历方式
void test_vector6()
{vector<int> v1{ 1,2,3,4 };for (vector<int>::iterator it = v1.begin();it != v1.end();it++){cout << *it << ' ';}
}
rbegin+rend
这里只展示一种遍历方式
void test_vector7()
{vector<int> v1{ 1,2,3,4 };vector<int>::reverse_iterator it = v1.rbegin();while (it != v1.rend()){cout << *it << ' ';it++;}
}
剩下的还有什么const_iterator等等下来大家可以自己试试
vector关于空间操作的成员函数
| 成员函数 | 功能 |
|---|---|
| size | 返回数据个数 |
| capacity | 返回空间大小 |
| empty | 判断容器是否为空 |
| resize | 改变容器的size大小 |
| reverse | 改变容器的capacity大小 |
前面三个相信大家都会用了,所以这里直接从resize开始讲起,如果不懂的可以去看我讲解的string那节。
resize
resize函数改变的是size的大小
void test_vector8()
{vector<int> v1{ 1,2,3,4 };cout << v1.size() << endl;v1.resize(10);cout << v1.size() << endl;
}
如果这里默认不给参数的话,就会直接默认分配空间,并且把新开辟的空间初始化为0
void test_vector8()
{vector<int> v1{ 1,2,3,4 };cout << v1.size() << endl;v1.resize(10, 3);cout << v1.size() << endl;for (int i = 0;i < v1.size();i++){cout << v1[i] << ' ';}
}
如果第二个给参数的话,剩下的空间就用第二个参数进行初始化
reverse函数
reverse和resize的用法相同。
但是需要注意的是:reverse的扩容的策略在每个平台下的每次的扩容量是不同的。
vs下capacity是按1.5倍增长的,g++是按2倍增长的。
vector的增删查改
push_back(尾插)
void test_vector9()
{vector<int> v1{ 1,2,3,4 };v1.push_back(1);
}
pop_back
void test_vector9()
{vector<int> v1{ 1,2,3,4 };v1.pop_back();
}
find(find函数并不是vector的成员函数,而是algorithm中的一个库函数)
void test_vector11()
{vector<int> v1{ 1,2,3,4 };vector<int>::iterator pos = find(v1.begin(), v1.end(), 1);cout << *pos << endl;
}
注意:find的返回值是迭代器,不是返回下标,而是返回对应的数的迭代器
Insert
Insert也是与迭代器相关的一个成员函数
void test_vector12()
{vector<int> v1{ 1,2,3,4 };v1.insert(v1.begin(), 1);
}
erase
void test_vector13()
{vector<int> v1{ 1,2,3,4 };v1.erase(v1.begin());
}
erase可以删除一个数据,也可以删除多个数据
void test_vector13()
{vector<int> v1{ 1,2,3,4 };v1.erase(v1.begin(), v1.end());
}
上面的代码是erase删除一段数据的场景
operator[]重载
vector支持[]访问,我们可以像数组一样进行访问比如:
int main()
{vector<int> v1{ 1,2,3,4,5,6,7,8,9 };for (int i = 0;i < v1.size();i++){cout << v1[i] << ' ';}return 0;
}
vector相较于数组的优势
在普通数组中不能进行复制操作,但是vector容器就支持复制操作,当我们需要复制一个容器的时候不需要用一个循环一个一个赋值,只需要用一个运算符重载=,就可以将容器中的值拷贝到另一个容器当中。
总结
在这篇关于“容器vector”的博客中,我们深入探讨了 C++ 中这个强大的数据结构。vector 提供了动态数组的功能,允许我们在运行时动态添加、删除元素,并且能够以常数时间复杂度访问元素,这使得它成为处理数据集合的理想选择。
我们了解了如何创建、初始化和操作 vector,以及如何使用其丰富的成员函数来满足各种需求。vector 的标准接口和异常安全性使得在处理数据时更加方便和安全。
通过学习本文,希望读者能够更加熟练地使用 vector,并且在实际项目中充分发挥它的优势。vector 不仅在算法和数据结构中有着广泛的应用,而且在各种类型的程序中都能发挥作用,从小型应用到大型系统都可以看到它的身影。
让我们继续深入学习和探索,掌握更多 C++ 中强大的工具和技术,不断提升自己的编程能力。感谢阅读!
相关文章:
深入理解C++中的Vector容器:用容器构建高效程序
文章目录 vector介绍vector常用的成员函数有关vector定义的函数vector的迭代器使用vector关于空间操作的成员函数vector的增删查改 总结 vector介绍 在C语言的库中包含有公共数据结构的实现,C的这个部分内容就是众所周知的STL(标准模版库)&a…...
目标检测YOLO实战应用案例100讲-基于深度学习的交通场景多尺度目标检测算法研究与应用(下)
目录 3.2 基于空洞卷积的特征融合模块设计 3.3 改进k-means聚类算法的anchor尺寸优化设计...
react 类组件 和 函数组件 声明周期 对比
React 的类组件和函数组件在生命周期方面存在一些差异。以下是它们之间的对比: 类组件的生命周期 React 类组件的生命周期可以分为三个阶段:挂载、更新和卸载。 1、挂载阶段: constructor():组件实例化时调用,用于…...
智慧变电站守护者:TSINGSEE青犀AI视频智能管理系统引领行业革新
一、方案概述 随着科技的不断进步,人工智能(AI)技术已经深入到各个领域。在变电站安全监控领域,引入AI视频监控智能分析系统,可以实现对站内环境、设备状态的实时监控与智能分析,从而提高变电站的安全运行…...
【Ubuntu20.04安装java-8-openjdk】
1 下载 官网下载链接: https://www.oracle.com/java/technologies/downloads/#java8 下载 最后一行 jdk-8u411-linux-x64.tar.gz,并解压: tar -zxvf jdk-8u411-linux-x64.tar.gz2 环境配置 1、打开~/.bashrc文件 sudo gedit ~/.bashrc2、…...
HTTPS对于网站到底价值几何?
现在HTTPS基本上已经是网站的标配了,很少会遇到单纯使用HTTP的网站。但是十年前这还是另一番景象,当时只有几家大型互联网公司的网站会使用HTTPS,大部分使用的都还是简单的HTTP,这一切是怎么发生的呢? 为什么要把网站…...
Docker私有仓库Harbor
简介 Docker私有仓库Harbor是一个开源的、企业级的Docker registry解决方案,它提供了安全、可靠和高效的容器镜像存储和分发服务。以下是关于Docker私有仓库Harbor的详细介绍: 一、Harbor的特点 基于角色的访问控制(RBAC)&#…...
48. 旋转图像/240. 搜索二维矩阵 II
48. 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 : 输入:matrix [[5,1,9,11],[2,4,…...
wsl安装Xfce桌面并设置系统语言和输入法
一、安装xfce (有相关的依赖都会安装) sudo apt -y install xfce4 二、 安装远程连接组件 sudo apt install xrdp -y 并重新启动 Xrdp 服务: sudo systemctl restart xrdp 本地windows系统中请按 winR 键 呼出运行 在运行中输入 mstsc…...
短信清空了!华为手机短信删除了怎么恢复?
“有没有人知道这是怎么回事呀,原先有一千多条未读一直放着没管,昨天根本没打开短信这个软件,今晚突然发现只剩一条了,是华为手机自动清理了吗!到底该怎么恢复呀?我真崩溃!” 在日常生活中&…...
Linux实现Flappy bird项目
目录 1、项目介绍 2、功能总结 3、前期准备 3.1 Ncurses库 3.2 信号机制 3.2.1 设置信号响应方式 3.2.2 设置定时器 4、代码实现 4.1 头文件引用及变量、函数定义 4.2 主函数 4.3 curses初始化 4.4 设置定时器 4.5 定时器响应函数 4.6 小鸟控制相关函数 4…...
【python量化交易】qteasy使用教程07——创建更加复杂的自定义交易策略
创建更加复杂的自定义交易策略 使用交易策略类,创建更复杂的自定义策略开始前的准备工作本节的目标继承Strategy类,创建一个复杂的多因子选股策略策略和回测参数配置,并开始回测 本节回顾 使用交易策略类,创建更复杂的自定义策略 …...
SpringBoot整合SpringScurity权限控制(菜单权限,按钮权限)以及加上SSH实现安全传输
文章目录 项目地址: 一、md5 与 先进的哈希算法的区别1.1. 安全性问题1.2. 设计目的1.3. 功能特性1.4. 适用性1.5. 总结 二、数据传输安全和数据加密实现:2.1 生成证书:2.2、在springboot中进行集成2.2.1 配置证书:2.2.2. 强制使用…...
力扣每日一题119:杨辉三角||
题目 简单 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出…...
AI语音模型PaddleSpeech踩坑(安装)指南
PaddleSpeech简介 PaddleSpeech 是基于飞桨 PaddlePaddle 的语音方向的开源模型库,用于语音和音频中的各种关键任务的开发,包含大量基于深度学习前沿和有影响力的模型。 PaddleSpeech安装步骤 提示:要找到一个合适的PaddleSpeech版本与pad…...
如何更好地使用Kafka? - 运行监控篇
要确保Kafka在使用过程中的稳定性,需要从kafka在业务中的使用周期进行依次保障。主要可以分为:事先预防(通过规范的使用、开发,预防问题产生)、运行时监控(保障集群稳定,出问题能及时发现&#…...
数据可视化训练第四天(模拟投掷筛子并且统计频次)
投掷一个筛子 import matplotlib.pyplot as plt from random import randint import numpy as npclass Die:"""模拟投掷筛子"""def __init__(self,num_sides6):self.num_sidesnum_sidesdef roll(self):return randint(1,self.num_sides)num1000…...
4.1 编写程序,从键盘接收一个小写字母,然后找出他的前导字符和后续字符,再按顺序显示这三个字符
方法一: 运行效果: 输入B,输出显示ABC;输入A,输出显示AB 思路: 1、通过键盘输入接收一个字母。 2、将输入的字母减去1,得到前导字符,然后输出。 3、将输入的字母加上1,得…...
(Java)心得:LeetCode——18.四数之和
一、原题 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): …...
网络编程套接字详解
目录 1. 预备介绍 2.网络字节序 3.udp网络程序 4.地址转换函数 5.udp网络编程 1.预备介绍 1.1源IP地址和目标IP地址 举个例子: 从北京出发到上海旅游, 那么源IP地址就是北京, 目标IP地址就是上海. 1.2 端口号 作用: 标识一个进程, 告诉OS这个数据交给那个进程来处理; (1)…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
