C++初阶:STL详解(三)——vector的介绍和使用

✨✨小新课堂开课了,欢迎欢迎~✨✨

🎈🎈养成好习惯,先赞后看哦~🎈🎈

所属专栏:C++:由浅入深篇

小新的主页:编程版小新-CSDN博客

前言:

前面我们刚刚了解了string类的使用和模拟实现,当对string有了一定的了解后,再来看vector的使用和后面要提到模拟实现是很好上手的。

C++初阶:STL详解(一)——string类-CSDN博客

C++初阶:string类的模拟实现-CSDN博客

一.什么是vector?

vector(向量)是C++标准库中的一种序列容器,它是一种非常常用的动态数组实现。可以高效的存储和访问一组相同类型的元素,能够自动管理储存,可动态增长或收缩。

 vector是一个模板类,定义在头文件(include<vector>)中,可以使用vector来存储和访问任意类型的对象。

二.vector的特性

1.动态数组:可以动态地增加和减少数组元素,自动管理内存分配和释放,不需要手动进行内存操作。

2.高效随机访问:支持随机访问

3.连续存储:元素在内存中连续存储

4.支持插入和删除:在尾部或头部插入和删除元素通常是高效的,但是其他位置的效率较低。

5.丰富的接口:提供了多种成员函数,如push_back,pop_back,insert,erase等,方便进行各种操作。

三.vector的文档介绍 

vector - C++ Reference(英文版)

std::vector - cppreference.com(中文版)

四.vector的使用

vector 在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的 。我们在后面模拟实现的时候,也是实现这些常见的接口。

4.1vector的定义

(constructor)构造函数声明接口说明
vector()(重点)无参构造
vector(size_type n, const value_type& val = value_type())构造并初始化n个val

vector (const vector& x); (重点)

拷贝构造

vector (InputIterator first, InputIterator last);使用迭代器进行初始化构造

1.vector(): 构造一个空vector

vector<int> v1;//构造一个int 类型的空容器

2.vector(size_type n, const value_type& val = value_type()):构造一个vector,元素个数为n,元素为value_type()

vector<int> v2(10, 1);//构造一个含有10个1的int类型容器vector<char> v5(10, 'c'); //构造一个含有10个c的char类型容器

3. vector (const vector& x) :拷贝构造

vector<int> v3(v2);//拷贝构造

4.vector (InputIterator first, InputIterator last) :使用迭代器区间进行初始化构造

vector<int> v4(v2.begin(), v2.end());//使用迭代器区间拷贝构造v2容器的一部分

4.2vector的空间增长问题

容量空间接口说明

size获取数据个数

capacity获取容量大小

empty判断是否为空

resize(重点)改变vector的size

reserve (重点)改变vector的capacity

size和capacity

void vector2()
{vector<int> v1(10, 1);cout << "size:" << v1.size() << endl;//获取当前容器有效元素的个数cout << "capacity:" << v1.capacity() << endl;//获取当前容器的容量大小}

运行结果:

小扩展:

我们在说string类的时候,也提到过。capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是2倍增长的。这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。

empty

用于判断当前容器是否为空,true:返回非0(一般是1):;false:返回0。

void vector2()
{vector<int> v1(10, 1);cout << v1.empty() << endl;
}

运行结果:0

resize和reserve

resize函数改变容器中的有效元素个数,reserse函数改变容器的容量。

resize规则:
 1、当所给值大于容当前容器的size时,将size扩大到该值,扩大的元素为第二个所给值,若未给出,则int型默认为0,char型默认是'\0'。

   2、当所给值小于容器当前的size时,将size缩小到该值。

reserve规则:
 1、当所给值大于当前容器的capacity时,将capacity扩大到该值。
 2、当所给值小于当前容器的capacity时,什么也不做,不会缩容。

void vector2()
{vector<int> v(10, 1);cout << "size:" << v.size() << endl;cout << "capacity:" << v.capacity() << endl;v.reserve(20);//改变当前容器的容量为20cout << "size:" << v.size() << endl;cout << "capacity:" << v.capacity() << endl;v.resize(5);//改变当前容器的size为5cout << "size:" << v.size() << endl;cout << "capacity:" << v.capacity() << endl;}

运行结果:

注意:reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。resize在开空间的同时还会进行初始化,影响size。

4.3vector迭代器的使用

iterator的使用接口说明
begin + end(重点)begin获取第一个数据位置的iterator/const_iterator, end获取最后一个数据的下一个位置的iterator/const_iterator
rbegin + rendrbegin获取最后一个数据位置的reverse_iterator,rend获取第一个数据前一个位置的reverse_iterator
 

void vector3()
{int arr[] = { 1,2,3,4,5,6,7,8,9 };vector<int> v(begin(arr), end(arr));//C++11将一个整形数组装换为vector//正向迭代器进行遍历cout << "正向迭代器遍历:";vector<int>:: iterator it = v.begin();while (it != v.end()){cout << *it << " ";it++;}cout << endl;//反向迭代器遍历cout << "反向迭代器遍历:";vector<int>::reverse_iterator rit = v.rbegin();while (rit != v.rend()){cout << *rit << " ";rit++;}cout << endl;}

运行结果:

除了上面遍历的方式,我们知道支持迭代器就支持范围for,因此我们也可以使用范围for对容器进行遍历。

void vector3()
{int arr[] = { 1,2,3,4,5,6,7,8,9 };vector<int> v(begin(arr), end(arr));//C++11将一个整形数组装换为vectorfor (auto ch : v){cout << ch << " ";}}

运行结果:

4.4vector的增删查改

vector增删查改接口说明
push_back(重点)尾插
pop_back (重点)尾删
find查找。(注意这个是算法模块实现,不是vector的成员接口)
insert在position之前插入val
erase删除position位置的数据
swap交换两个vector的数据空间
operator[] (重点)像数组一样访问

push_back 和 pop_back

void vector4()
{vector<int> v;v.push_back(1);//尾插v.push_back(2);v.push_back(3);v.push_back(4);v.pop_back();//尾删vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";it++;}}

运行结果:

find

find:
template <class InputIterator, class T>InputIterator find (InputIterator first, InputIterator last, const T& val)

find函数有三个参数,前两个参数确定了一个迭代器区间(左闭右开),第三个参数确定所要寻找的值。find函数在所给迭代器区间寻找第一个匹配的元素,并返回它的迭代器,若未找到,则返回所给的第二个参数。 

insert和erase 

void vector4()
{vector<int> v;v.push_back(1);//尾插v.push_back(2);v.push_back(3);v.push_back(4);vector<int>:: iterator pos = find(v.begin(), v.end(), 3);//返回元素为3位置的迭代器v.insert(pos, 8);//在pos位置插入一个8pos = find(v.begin(), v.end(), 4);v.erase(pos);//删除pos位置的元素vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";it++;}cout << endl;}

运行结果:

swap

swap函数可以交换两个容器的数据空间,实现两个容器的交换。

void vector5()
{vector<int> v1(10, 1);vector<int> v2(5, 2);cout << "交换前:" << endl;cout << "v1:" << v1.size() <<" "<< v1.capacity() << endl;cout << "v2:" << v2.size() <<" "<< v2.capacity() << endl;swap(v1,v2);cout << "交换后:" << endl;cout << "v1:" << v1.size() <<" "<< v1.capacity() << endl;cout << "v2:" << v2.size() << " "<<v2.capacity() << endl;
}

运行结果:

operator[]

vector当中实现了 [ ] 操作符的重载,因此我们也可以通过“下标+[ ]”的方式对容器当中的元素进行访问。当然也可以对其进行修改。

void vector6()
{int arr[] = { 1,2,3,4,5,6,7,8,9 };vector<int> v(begin(arr), end(arr));//C++11将一个整形数组装换为vectorfor (int i = 0; i < v.size(); i++){v[i] += 2;cout << v[i] << " ";}cout << endl;
}

运行结果:

 不知不觉中,我们就已经知道了四种遍历容器的方式了:下标+[]/正向迭代器/反向迭代器/范围for。

总结:

以上就是对vector及其常见接口的介绍,这里还有一个经典的迭代器失效的问题,我们后面讲,vector的难点在于模拟实现,这个放在迭代器失效问题之后也会讲。

感谢大家的观看,创作不易,还请各位大佬点赞支持~

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

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

相关文章

VTD激光雷达(2)——02_OptiX_Lidar

BRDF公式计算强度&#xff0c;关键是材料 表面凹凸不平可以在三维模型中建立 &#xff1b;一般是建模是平的&#xff0c;在软件中设置 第二章图片有水 问题PBR和非PBR的区别

【Linux】-基本指令(上)

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;深入代码世界&#xff0c;了解掌握 Linux 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 与Windows环境不同&#xff0c;我们…

【算法】动态规划—最长公共子序列

最长公共子序列问题就是求出两个字符串的LCS长度&#xff0c;是一道非常经典的面试题目&#xff0c;因为它的解法是典型的二维动态规划。 比如输入 str1 "babcde", str2 "acbe"&#xff0c;算法应该输出3&#xff0c;因为 str1 和 str2 的最长公共子序列…

视频格式转为mp4(使用ffmpeg)

1、首先安装ffmpeg&#xff0c;下载链接如下 https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-6.1.1-full_build.7z 安装后确保ffmpeg程序加到PATH路径里&#xff0c;cmd执行ffmpeg -version出现下图内容表示安装成功。 2、粘贴下面的脚本到文本文件中&#xff0c;文件后缀…

基于对数变换的图像美白增强,Matlab实现

博主简介&#xff1a;matlab图像处理&#xff08;QQ:3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于对数变换的图像美白增强&#xff0c;用matlab实现。 一、案例背景和算法介绍 这次案例是美白算法&…

re题(20)BUUCTF [GWCTF 2019]pyre

BUUCTF在线评测 (buuoj.cn) Python解包及反编译: PyInstaller Extractoruncompyle6 - 知乎 (zhihu.com) python撤消&#xff1a; Pycharm撤销操作和代码跳转后退回操作以及消除波浪线操作快捷键_pycharm怎么反撤销-CSDN博客 把.pyc文件变成py文件 把.py文件用记事本打开 cod…

每日OJ_牛客_BC64 牛牛的快递

目录 牛客_BC64 牛牛的快递&#xff08;简单模拟&#xff09; 解析代码1 解析代码2 牛客_BC64 牛牛的快递&#xff08;简单模拟&#xff09; 牛牛的快递_牛客题霸_牛客网 描述 牛牛正在寄快递&#xff0c;他了解到快递在 1kg 以内的按起步价 20 元计算&#xff0c;超出部…

Qt ORM模块使用说明

附源码&#xff1a;QxOrm是一个C库资源-CSDN文库 使用说明 把QyOrm文件夹拷贝到自己的工程项目下, 在自己项目里的Pro文件里添加include($$PWD/QyOrm/QyOrm.pri)就能使用了 示例test_qyorm.h写了表的定义,Test_QyOrm_Main.cpp中写了所有支持的功能的例子: 通过自动表单添加…

【代码随想录Day14】二叉树Part02

226.翻转二叉树 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 遍历二叉树&#xff0c;交换每个节点的左右子树。 class Solution {public TreeNode invertTree(TreeNode root) {preorder(root);return root;}public static void preorder(TreeNode root) {if (root nu…

基于微信小程序的学生公寓电费信息管理系统+ssm(lw+演示+源码+运行)

基于微信小程序的学生公寓电费信息管理系统 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;微信小程序被…

服务器上PFC配置丢失问题排查与解决方案

现象 基于nccl的多轨通信算力中心出现交换机端口出入方向丢包 分析 机间通信使用RoCE网络&#xff0c;为了避免因丢包导致大量重传报文影响训练性能&#xff0c;我们基于PFC和ECN在交换机和服务器配置搭建了无损网络&#xff0c;理论上是不允许丢包的&#xff0c;现在出现交…

TryHackMe 第1天 | Introduction to Cyber Security

偶然之间了解到了TryHackMe这个网站&#xff0c;尝试跟着其中的学习路径进行学习&#xff0c;发现还是挺适合入门网络安全这一领域的。但是这个网站包含了很多内容&#xff0c;如果不用一些东西记录下来&#xff0c;那么很容易忘记&#xff0c;所以打算在此记录一下学习过程。 …

JUC学习笔记(三)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 八、共享模型之工具--JUC8.1 AQS 原理1. 概述2 实现不可重入锁自定义同步器自定义锁 3.心得起源目标设计1) state 设计2&#xff09;阻塞恢复设计3&#xff09;队列…

linux 操作系统下date 命令介绍和使用案例

linux 操作系统下date 命令介绍和使用案例 在 Linux 操作系统中&#xff0c;date 命令是一个用于显示和设置系统日期和时间的基本工具。它不仅可以显示当前的日期和时间&#xff0c;还允许用户以不同的格式输出日期&#xff0c;并进行日期计算 1. date 命令简介 date 命令用…

神经网络_使用tensorflow对fashion mnist衣服数据集分类

from tensorflow import keras import matplotlib.pyplot as plt1.数据预处理 1.1 下载数据集 fashion_mnist keras.datasets.fashion_mnist #下载 fashion mnist数据集 (train_images, train_labels),(test_images, test_labels) fashion_mnist.load_data()print("t…

C++广义表的介绍及创建方法-附C语言实现代码

1. 简介 数组可以存储不允许再分割的数据元素&#xff0c;如字符’X’&#xff0c;数字11&#xff0c;当然它也可以存储数组&#xff0c;二维数组就是一个例子&#xff0c;你可以理解二维数组的每一行的元素是一列中的对应元素的组合。 广义表是一种线性表&#xff0c;或者说…

JVM HotSpot 虚拟机: 对象的创建, 内存布局和访问定位

目录 前言 对象的创建 对象的内存布局 对象的访问定位 前言 了解JVM的内存区域划分之后, 也大致了解了java程序的内存分布模型, 也了解它里面的内存区域里面的类型和各个类型的作用, 接下来我们进一步从对象创建到访问的角度, 来看看这些内存区域之间是怎么关联起来的. …

2023高教社杯全国大学生数学建模竞赛C题 Python代码演示

目录 问题一1.1 蔬菜类商品不同品类或不同单品之间可能存在一定的关联关系&#xff0c;请分析蔬菜各品类及单品销售量的分布规律及相互关系。数据预处理数据合并提取年、月、日信息对蔬菜的各品类按月求销量均值 季节性时间序列分解STL分解加法分解乘法分解 ARIMALSTM import p…

什么是代理IP_如何建立代理IP池?

什么是代理IP_如何建立代理IP池&#xff1f; 1. 概述1.1 什么是代理IP&#xff1f;1.2 代理IP的工作原理1.3 爬虫的应用场景1.3.1 搜索引擎&#xff0c;最大的爬虫1.3.2 数据采集&#xff0c;市场分析利器1.3.3 舆情监控&#xff0c;品牌营销手段1.3.4 价格监测&#xff0c;全网…