当前位置: 首页 > news >正文

深入理解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语言的库中包含有公共数据结构的实现&#xff0c;C的这个部分内容就是众所周知的STL&#xff08;标准模版库&#xff09;&a…...

目标检测YOLO实战应用案例100讲-基于深度学习的交通场景多尺度目标检测算法研究与应用(下)

目录 3.2 基于空洞卷积的特征融合模块设计 3.3 改进k-means聚类算法的anchor尺寸优化设计...

react 类组件 和 函数组件 声明周期 对比

React 的类组件和函数组件在生命周期方面存在一些差异。以下是它们之间的对比&#xff1a; 类组件的生命周期 React 类组件的生命周期可以分为三个阶段&#xff1a;挂载、更新和卸载。 1、挂载阶段&#xff1a; constructor()&#xff1a;组件实例化时调用&#xff0c;用于…...

智慧变电站守护者:TSINGSEE青犀AI视频智能管理系统引领行业革新

一、方案概述 随着科技的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;技术已经深入到各个领域。在变电站安全监控领域&#xff0c;引入AI视频监控智能分析系统&#xff0c;可以实现对站内环境、设备状态的实时监控与智能分析&#xff0c;从而提高变电站的安全运行…...

【Ubuntu20.04安装java-8-openjdk】

1 下载 官网下载链接&#xff1a; https://www.oracle.com/java/technologies/downloads/#java8 下载 最后一行 jdk-8u411-linux-x64.tar.gz&#xff0c;并解压&#xff1a; tar -zxvf jdk-8u411-linux-x64.tar.gz2 环境配置 1、打开~/.bashrc文件 sudo gedit ~/.bashrc2、…...

HTTPS对于网站到底价值几何?

现在HTTPS基本上已经是网站的标配了&#xff0c;很少会遇到单纯使用HTTP的网站。但是十年前这还是另一番景象&#xff0c;当时只有几家大型互联网公司的网站会使用HTTPS&#xff0c;大部分使用的都还是简单的HTTP&#xff0c;这一切是怎么发生的呢&#xff1f; 为什么要把网站…...

Docker私有仓库Harbor

简介 Docker私有仓库Harbor是一个开源的、企业级的Docker registry解决方案&#xff0c;它提供了安全、可靠和高效的容器镜像存储和分发服务。以下是关于Docker私有仓库Harbor的详细介绍&#xff1a; 一、Harbor的特点 基于角色的访问控制&#xff08;RBAC&#xff09;&#…...

48. 旋转图像/240. 搜索二维矩阵 II

48. 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 &#xff1a; 输入&#xff1a;matrix [[5,1,9,11],[2,4,…...

wsl安装Xfce桌面并设置系统语言和输入法

一、安装xfce &#xff08;有相关的依赖都会安装&#xff09; sudo apt -y install xfce4 二、 安装远程连接组件 sudo apt install xrdp -y 并重新启动 Xrdp 服务&#xff1a; sudo systemctl restart xrdp 本地windows系统中请按 winR 键 呼出运行 在运行中输入 mstsc…...

短信清空了!华为手机短信删除了怎么恢复?

“有没有人知道这是怎么回事呀&#xff0c;原先有一千多条未读一直放着没管&#xff0c;昨天根本没打开短信这个软件&#xff0c;今晚突然发现只剩一条了&#xff0c;是华为手机自动清理了吗&#xff01;到底该怎么恢复呀&#xff1f;我真崩溃&#xff01;” 在日常生活中&…...

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——创建更加复杂的自定义交易策略

创建更加复杂的自定义交易策略 使用交易策略类&#xff0c;创建更复杂的自定义策略开始前的准备工作本节的目标继承Strategy类&#xff0c;创建一个复杂的多因子选股策略策略和回测参数配置&#xff0c;并开始回测 本节回顾 使用交易策略类&#xff0c;创建更复杂的自定义策略 …...

SpringBoot整合SpringScurity权限控制(菜单权限,按钮权限)以及加上SSH实现安全传输

文章目录 项目地址&#xff1a; 一、md5 与 先进的哈希算法的区别1.1. 安全性问题1.2. 设计目的1.3. 功能特性1.4. 适用性1.5. 总结 二、数据传输安全和数据加密实现&#xff1a;2.1 生成证书&#xff1a;2.2、在springboot中进行集成2.2.1 配置证书&#xff1a;2.2.2. 强制使用…...

力扣每日一题119:杨辉三角||

题目 简单 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出…...

AI语音模型PaddleSpeech踩坑(安装)指南

PaddleSpeech简介 PaddleSpeech 是基于飞桨 PaddlePaddle 的语音方向的开源模型库&#xff0c;用于语音和音频中的各种关键任务的开发&#xff0c;包含大量基于深度学习前沿和有影响力的模型。 PaddleSpeech安装步骤 提示&#xff1a;要找到一个合适的PaddleSpeech版本与pad…...

如何更好地使用Kafka? - 运行监控篇

要确保Kafka在使用过程中的稳定性&#xff0c;需要从kafka在业务中的使用周期进行依次保障。主要可以分为&#xff1a;事先预防&#xff08;通过规范的使用、开发&#xff0c;预防问题产生&#xff09;、运行时监控&#xff08;保障集群稳定&#xff0c;出问题能及时发现&#…...

数据可视化训练第四天(模拟投掷筛子并且统计频次)

投掷一个筛子 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 编写程序,从键盘接收一个小写字母,然后找出他的前导字符和后续字符,再按顺序显示这三个字符

方法一&#xff1a; 运行效果&#xff1a; 输入B&#xff0c;输出显示ABC&#xff1b;输入A&#xff0c;输出显示AB 思路&#xff1a; 1、通过键盘输入接收一个字母。 2、将输入的字母减去1&#xff0c;得到前导字符&#xff0c;然后输出。 3、将输入的字母加上1&#xff0c;得…...

(Java)心得:LeetCode——18.四数之和

一、原题 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; …...

网络编程套接字详解

目录 1. 预备介绍 2.网络字节序 3.udp网络程序 4.地址转换函数 5.udp网络编程 1.预备介绍 1.1源IP地址和目标IP地址 举个例子: 从北京出发到上海旅游, 那么源IP地址就是北京, 目标IP地址就是上海. 1.2 端口号 作用: 标识一个进程, 告诉OS这个数据交给那个进程来处理; (1)…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...