vector讲解

在学习玩string后我们开始学习vector,本篇博客将对vector进行简单的介绍,还会对vector一些常用的函数进行讲解

vector的介绍

实际上vector就是一个数组的数据结构,但是vector是由C++编写而成的,他和数组也有本质上的区别,但也有相同点,他的特征概括如下:

  1. vector是表示可变大小数组的序列容器。
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
  4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
  5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
  6. 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。

对于C语言中的数组,二者有很多的异同点,我将其概括如下:

相同点:
1 二者都是采用连续的空间来存储元素
2 二者都能通过下标进行访问
不同点:
1 vector是采用动态开辟,容器大小可以动态改变,并且是自动处理
2vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大 
vector的使用
vector的定义

vector的定义就差不多是初始化以及拷贝构造和构造,这些在之前的string类函数讲解中也提到了,其实都大差不差的
在这里插入图片描述
构造并初始化:
第一个参数是你要初始化元素的个数,第二个参数是你要初始化成的字符
这里需要注意**<>里面就是你要放入vector里元素的类型**

vector<int> v(10, 1);
for (auto ch : v)
{
	cout << ch;
}
cout << endl;

在这里插入图片描述
拷贝构造:
其实都大差不差,学习了前面的string和类和对象后都很简单了

	vector<int> v(10, 1);
	vector<int> v1(v);
	for (auto ch : v1)
	{
		cout << ch;
	}
	cout << endl;

在这里插入图片描述

vector iterator 的使用

迭代器很常用,咱们做个简单的讲解
在这里插入图片描述
迭代器同样地分为正向和反向:
我们可以通过一个简单的代码来了解迭代器的使用

vector<int> v;
for (int i = 1; i <= 5; i++)
{
	v.push_back(i);
}
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
	cout<< ' ' << *it;
}
cout << endl;

在这里插入图片描述
下面为反向迭代器:
反向迭代器记得加上reverse

vector<int> v;
for (int i = 1; i <= 5; i++)
{
	v.push_back(i);
}
for (vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); it++)
{
	cout<< ' ' << *it;
}
cout << endl;

在这里插入图片描述
关于begin和rbegin,end和rend的位置的关系如下图所示,我们要记得,两种迭代器都是从begin开始遍历:
通过这张图,我们需要注意到一个很重要的点:
迭代器的区间都是左闭右开的!所以end是在最后一个元素的后一个位置!
在这里插入图片描述

vector 空间增长问题


其实空间增长问题我在之前的string类就有提到过,都是有规律可循的:
1 capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。vector增容都是2倍,具体增长多少是根据具体的需求定义
2 reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。
3 resize在开空间的同时还会进行初始化,影响size

可以看到,resize默认就是初始化为0:
同时改变了capacity和size
在这里插入图片描述
而reserve只改变了capacity,并且不会有初始化的功能:

vector<int> v;
v.reserve(10);
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
	cout<< ' ' << *it;
}
cout << endl;
cout << "former:" << endl;
cout << v.size() << endl;
cout << v.capacity() << endl;
v.reserve(20);
cout << endl;
cout << "after:" << endl;
cout << v.size() << endl;
cout << v.capacity() << endl;

在这里插入图片描述

vector 增删查改

在这里插入图片描述
pushback尾插和popback尾删:

都很简单,拿一段简单的代码来演示一下吧:

vector<int> v;
v.resize(10,1);
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
	cout<< ' ' << *it;
}
cout << endl;
v.push_back(2);
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
	cout << ' ' << *it;
}
cout << endl;
v.pop_back();
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
	cout << ' ' << *it;
}
cout << endl;

在这里插入图片描述
insert插入函数:
这里如果需要在其他地方插入就在begin上进行+操作

vector<int> v;
v.resize(10,1);
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
	cout<< ' ' << *it;
}
cout << endl;
vector<int>::iterator it = v.begin();
v.insert(it, 3);
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
	cout << ' ' << *it;
}
cout << endl;

在这里插入图片描述
erase函数:
erase函数可以根据下标索引来删除元素,但是再insert后要重新给下标赋值,insert前的下标i已经失效了,其实这就是所说的:迭代器失效问题!

在这里我们插入了元素后会发生扩容,原空间可能已经被释放了(或者说如果erase删除了最后一个位置的元素,vector里已经没有元素可以删除,也会导致迭代器失效),但是erase后我们又使用it打印,这里的it可能使用的就是原空间,程序就会发生崩溃,所以我们需要在执行完insert后再次对it进行赋值,不然就会发生这种情况(但是一些编译器对于迭代器失效没有过于严格的检查,所以程序不会崩溃,但是程序输出的结果不对)

在这里插入图片描述

通常解决迭代器失效最简单的方法就是:
对迭代器重新赋值

vector<int> v;
v.resize(10,1);
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
	cout<< ' ' << *it;
}
cout << endl;
vector<int>::iterator i = v.begin();
v.insert(i+3, 3);
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
	cout << ' ' << *it;
}
cout << endl;
i = v.begin();
v.erase(i+3);
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
	cout << ' ' << *it;
}
cout << endl;

在这里插入图片描述
swap函数:
我们通过一段简单的代码来了解一下:
我们交换前打印两个vector对象中的元素,交换后再打印一次

vector<int> v1;
v1.resize(10,1);
cout << "交换前" << endl;
cout << "v1:";
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
	cout<< ' ' << *it;
}
cout << endl;
vector<int> v2;
v2.resize(10, 2);
cout << "v2:";
for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++)
{
	cout << ' ' << *it;
}
cout << endl;
v1.swap(v2);
cout << "交换后" << endl;
cout << "v1:";
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
	cout << ' ' << *it;
}
cout << endl;
cout << "v2:";
for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++)
{
	cout << ' ' << *it;
}
cout << endl;

在这里插入图片描述

好了,今天的分享到这里就结束了,谢谢大家的支持!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pandas操作excel

目录 一&#xff1a;创建excel 二&#xff1a;修改excel 三&#xff1a;查找excel 四&#xff1a;删除数据 五&#xff1a;合并excel数据 一&#xff1a;创建excel import pandas as pd # 创建DataFrame对象 data { Name: [Alice, Bob, Charlie], Age: [25, 30, 35], S…

ISA Server 2006部署网站对比nginx

2024年了&#xff0c;我还是第1次使用ISA Server 。没办法在维护一个非常古老的项目。说到ISA Server可能有小伙们不清楚&#xff0c;但是说到nginx大家应该都知道吧。虽然他们俩定位并不相同&#xff0c;但是本文中提到的需求&#xff0c;他俩是都可以实现。 网上找的到的教程…

力扣:(692. 前K个高频单词)

题目1&#xff1a; 题目链接 思路1&#xff1a;首先可以使用map来统计单词出现的次数。然后使用vector将pair存起来&#xff0c;接着使用stable_sort排序(要保证数据具有稳定性)&#xff0c;然后返回前k个单词即可。 难点&#xff1a;需要写一个比较函数&#xff08;仿函数&am…

SAP S/4HANA 2023 Fully-Activated Appliance 虚拟机版介绍

注&#xff1a;市面上所有在售虚拟机均为拷贝本人所作的虚拟机&#xff0c;存在各种技术问题&#xff0c;请知悉。 SAP S4HANA 2023 FAA版本内置了四个Client&#xff1a; 1、000&#xff1a;SAP初始Client&#xff0c;原则上不能动&#xff1b; 2、100&#xff1a;只激活了US…

java SSM网上小卖部管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM网上小卖部管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源 代码和数据库&#xff0c;系统主要…

【Docker篇】详细讲解容器相关命令

&#x1f38a;专栏【Docker】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f6f8;容器&#x1f339;相关命令&#x1f354;案例⭐创建并运…

WorkPlus Meet私有化视频会议软件-构建安全高效的内网会议体验

在企业内部&#xff0c;高效的会议协作是推动团队协同和工作效率的关键。而内网会议系统成为了构建安全高效的内部会议体验的必要工具。作为一家领先的内网会议系统&#xff0c;WorkPlus Meet以其卓越的性能和智能化的功能&#xff0c;助力企业实现高效安全的内部会议体验。 为…

GPU与SSD间的P2P DMA访问机制

基于PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;总线连接CPU、独立GPU和NVMe SSD的系统架构。 在该架构中&#xff0c;PCIe Swicth支持GPU与SSD之间快速的点对点直接内存访问&#xff08;peer-to-peer, p2p DMA&#xff09;。通常情况下&#xff0…

详细版Git的下载安装与配置(Windows)

一、git的下载 Git是一个非常好用的版本控制工具。下载地址如下&#xff1a;Git - Downloads。建议使用国内浏览器下载&#xff0c;因为不用翻墙&#xff0c;速度快。 当你用浏览器去访问上面的地址后&#xff0c;下载页面会自动识别你的电脑系统&#xff0c;如下 点击&#…

RHEL - 为网络隔离主机构建本地软件 Repo

《OpenShift / RHEL / DevSecOps 汇总目录》 文章目录 构建本地共享软件 Repo 的方法说明准备可联网主机方法1&#xff1a;使用 ISO 制作本地共享 Repo方法2&#xff1a;使用 reposync 制作本地共享 Repo方法3&#xff1a;制作包含特定软件的本地独享 Repo方法4&#xff1a;使用…

electron-vite中的ipc通信

1. 概述 再electron中&#xff0c;进程间的通信通过ipcMain和ipcRenderer模块&#xff0c;这些通道是任意和双向的 1.1. 什么是上下文隔离进程 ipc通道是通过预加载脚本绑定到window对象的electron对象属性上的 2. 通信方式 2.1. ipcMain&#xff08;也就是渲染进程向主进…

WorkPlus内网通信软件的首选,助力企业实现高效内部沟通与协同

在企业内部&#xff0c;高效沟通是推动工作顺利进行的关键。而内网通信软件则成为了营造安全高效内部沟通环境的必要工具。作为一家领先的内网通信软件&#xff0c;WorkPlus以其卓越的性能和专业的功能&#xff0c;助力企业构建高效的内部沟通网络。 为什么选择WorkPlus作为内…

【Docker】部署和运行青龙面板:一个支持python3、javaScript、shell、typescript 的定时任务管理面板

引言 青龙面板是一个支持python3、javaScript、shell、typescript 的定时任务管理面板。 步骤 拉取镜像 从 Docker Hub 上拉取最新的 “qinglong” 镜像。 docker pull whyour/qinglong:latest启动容器 使用刚刚拉取的镜像来启动一个新的 Docker 容器。 docker run -dit \-v…

Java设计模式-前言

大家好&#xff0c;我是馆长&#xff01;从今天开始馆长开始对java设计模式进行讲解和整理分享给大家。馆长会尽快的整理完成设计模式的所有内容和讲解代码。从多方面进行模式的详细说明&#xff0c;方便各位看官理解和易学。 软件设计模式的概念 软件设计模式&#xff08;Sof…

Tensorflow2 GPU版本-极简安装方式

Tensorflow2 GPU版本-极简安装方式&#xff1a; 1、配置conda环境加速 https://wtl4it.blog.csdn.net/article/details/135723095https://wtl4it.blog.csdn.net/article/details/135723095 2、tensorflow-gpu安装 conda create -n STZZWANG_TF2 tensorflow-gpu2.0

11 - PXC集群|MySQL存储引擎

PXC集群&#xff5c;MySQL存储引擎 数据库系列文章PXC集群配置集群测试集群 MySQL存储引擎存储引擎介绍mysql服务体系结构mysql服务的工作过程处理查询访问的工作过程处理存储insert访问的工作过程 什么是搜索引擎 存储引擎管理查看存储引擎修改存储引擎 存储引擎特点myisam存储…

基于JavaWeb+SSM+Vue基于微信小程序的在线投稿系统的设计和实现

基于JavaWebSSMVue基于微信小程序的在线投稿系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2 2.1微信小程序 2 2.2 MYSQL数据库 3 2.3 u…

【Docker】安装Nginx容器并部署前后端分离项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Docker实战》。&#x1f3af;&#x1f3af; &…

使用vscode在wsl2中配置clangd环境

在vscode中安装这三个插件&#xff08;clangd需要科学上网或者从VSIX安装&#xff09; 之后创建一个空目录并进去。 使用快捷键ctrlshiftp&#xff0c;输入命令 Cmake:Quick Start 根据步骤选择。注意在创建CMakeLists.txt这一步选择跳过&#xff0c;直接输入enter&#xff0c…

【RHCE服务搭建实验】之DNS

目录 一、DNS简介二、安装DNS 一、DNS简介 域名系统&#xff08;DNS&#xff09;是一个分层的分布式数据库。它存储用于将Internet主机名映射到IP地址&#xff08;反之亦然&#xff09;的信息、邮件路由信息以及Internet应用程序使用的其他数据。 客户端通过调用解析器库在DNS…