vector容器 [上]

news2024/10/5 14:25:12

目录

一、 对于vector的介绍

二、vector的定义

0x01 无参构造

 0x02 构造并初始化n个val

 0x03 使用迭代器进行初始化构造

0x04 拷贝构造  

 0x05 比较

 三、 vector的遍历

0x01 push_back()

0x02 operator[] 和at()

0x03 遍历  

 四、vector 容量空间

 0x01 max_size : 返回vector可以容量的最大元素数

 0x02 reserve : 容量改变

 0x03 resize :改变个数

 五、vector的增删改查

0x01 assign()

 0x02 vector查找find()方法

0x03 Insert()

 0x04 erase() 删除

 0x05 clear()



一、 对于vector的介绍

参考: https://cplusplus.com/reference/vector/vector/

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

二、vector的定义

构造函数(constructor)声明:

0x01 无参构造

vector<int> x1;//只定义,但是没有进行初始化

 0x02 构造并初始化n个val

vector<int> x2(5,4);//构造并初始化为5个4

 0x03 使用迭代器进行初始化构造

vector<int> x3(++x2.begin(),--x2.end());//去掉一头一尾

0x04 拷贝构造  

vector<int> x4(x3);//拷贝构造

 0x05 比较

string s1("hello world"); vector<char> x5(s1.begin(),s1.end());

 此时我们会想,上面的vector<char> 类型是否能替代string呢?

当然不能
角度一:string 的末尾带有'\0',但是从上图来看vector<char>并没有带'\0'

角度二:string的接口,vector是否都有,从https://cplusplus.com/中参考,string所拥有的接口,vector并不是都有

 三、 vector的遍历

0x01 push_back()

vector<int> x1;
x1.push_back(1);//尾插
x1.push_back(2);
x1.push_back(3);

0x02 operator[] 和at()

operator[]:

vector<int> x2;
x2.push_back(1);
x2.push_back(2);
x2.push_back(3);
x2.resize(1);
x2[2];

 operator[]当越界的时候会进行断言

 at():

vector<int> x2;
x2.push_back(1);
x2.push_back(2);
x2.push_back(3);
x2.resize(1);
x2.at(2);

 at()当越界的时候会进行抛异常

0x03 遍历  

vector的遍历主要有3种方式:

 方式一: for循环

for (size_t i = 0;i < x1.size();i++)
{
	x1[i] += 1;
	cout << x1[i] << " ";
}
cout << endl;

方式二: 迭代器

vector<int>::iterator it = x1.begin();//内嵌类型
while (it != x1.end())
{
	*it -= 1;
	cout << *it << " ";
	++it;
}
cout << endl;

方式三:范围for

for (auto e: x1)
{
	cout << e << " ";
}
cout << endl;

上面三种遍历方式所得结果如下:
其次,我们可以知道的是原生指针就是一个天然的迭代器,数组支持范围for,那么就会被替换成指针

 四、vector 容量空间

vector的容量空间主要学习一下5个接口:

 0x01 max_size : 返回vector可以容量的最大元素数

vector<char> x1;
cout << x1.max_size() << endl;
vector<int> x2;
cout << x2.max_size() << endl;

 0x02 reserve : 容量改变

vector<int> x1;
x1.reserve(100);//将x1的容量变为了100,但并没有进行初始化

 0x03 resize :改变个数

 vector<int> x2;
x2.resize(100);//改变个数并进行初始化,初始化值(第二个参数)也可以自己定义

 并且如果改变的个数比当前个数小,也可以进行删除,但是其容量一般不会进行缩小:

vector<int> x2;
x2.push_back(1);
x2.push_back(2);
x2.push_back(3);//当前个数为3
x2.resize(1);//通过改变变为了1

 五、vector的增删改查

0x01 assign()

介绍:将新内容指定给vector,替换其当前内容,并相应地修改其大小

vector<int> x1;
x1.push_back(1);
x1.push_back(2);
x1.push_back(3);
x1.assign(5,5);

 0x02 vector查找find()方法

为什么vector中没有find(),因为如果有find(),那么应该也是从头找到尾,其复杂度应该是o(n)如果一定想用find()方法查找的话可以去<algorithm>库中使用,头文件是#include<algorithm>

 该find()方法的参数分别是左右区间,左闭右开include<algorithm>

int main()
{
	vector<int> x1;
	x1.push_back(1);
	x1.push_back(2);
	x1.push_back(3);
	//vector<int>::iterator it =  find(x1.begin(),x1.end(),2);
	//也可以用auto 进行推导
	auto it = find(x1.begin(), x1.end(), 2);
	if (it != x1.end())
	{
		cout << "找到了" << endl;
	}
}

0x03 Insert()

//用Insert()进行头插
int main()
{
	vector<int> x1;
	x1.push_back(1);
	x1.push_back(2);
	x1.push_back(3);
	for (auto e: x1)
	{
		cout << e << " ";
	}
	cout << endl;
	x1.insert(x1.begin(),4);
	for (auto e : x1)
	{
		cout << e <<" ";
	}
	cout << endl;
}

//在find()位置进行插入
int main()
{
	vector<int> x1;
	x1.push_back(1);
	x1.push_back(2);
	x1.push_back(3);
	for (auto e : x1)
	{
		cout << e << " ";
	}
	cout << endl;
	auto it = find(x1.begin(), x1.end(), 2);
	if (it != x1.end())
	{
		cout << "找到了" << endl;
		x1.insert(it,4);
	}
	for (auto e : x1)
	{
		cout << e << " ";
	}
	cout << endl;
}

 0x04 erase() 删除

int main()
{
	vector<int> x1;
	x1.push_back(1);
	x1.push_back(2);
	x1.push_back(3);
	//先进行寻找
	vector<int>::iterator it = find(x1.begin(),x1.end(),3);
	//要进行判断,如果没有找到,那么it位置应该在end()位置,没有这个值就会出现问题
	if (it != x1.end())
	{
		x1.erase(it);
	}
}

 如果没有找到要找的值,并且没有进行if判断,即让it位置在end()位置时:

int main()
{
	vector<int> x1;
	x1.push_back(1);
	x1.push_back(2);
	x1.push_back(3);
	//先进行寻找
	vector<int>::iterator it = find(x1.begin(),x1.end(),300);
	x1.erase(it);
}

 0x05 clear()

介绍:从向量中删除所有元素(已销毁),即清除个数,但是容量不会改变

int main()
{
	vector<int> x1;
	x1.push_back(1);
	x1.push_back(2);
	x1.push_back(3);
	for (auto e : x1)
	{
		cout << e << " ";
	}
	cout << endl;
	x1.clear();
	for (auto e : x1)
	{
		cout << e << " ";
	}
	cout << endl;
}

 显示结果如下:

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

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

相关文章

【设置教程】未使用系统分配DNS地址 如何设置?答:

未使用系统分配DNS地址&#xff0c;是你的域名解析DNS地址不是当前系统的DNS地址。 设置方法&#xff1a;先关闭更新。域名控制台--域名列表--安全设置&#xff1a; 通过短信验证。 2、修改DNS地址&#xff1a;域名控制台--域名列表&#xff1a;点击域名&#xff1a; 3、点击&…

C语言函数速查

scanf函数 函数概要&#xff1a; scanf 函数从标准输入流中读取格式化字符串。 与 printf 格式化输出函数相反&#xff0c;scanf 函数是格式化输入函数。 函数原型&#xff1a; #include <stdio.h> ... int scanf(const char *format, ...);参数解析&#xff1a; 1…

事务 ---MySQL的总结(六)

事务 多进程进行并改变同一个数据&#xff0c;如果没有进行版本控制&#xff0c;就会出现数据不确定的问题&#xff0c;为此引入了事务的概念。可以进行数据回滚&#xff0c;解决潜在的问题。 事务的概念 一组的DML组成&#xff0c;这一些的DML要么同时成功&#xff0c;要么同…

Linux上开启coredump

Linux上开启core dump Core dump&#xff08;核心转储&#xff09;是在程序崩溃时生成的一种文件&#xff0c;其中包含了程序在崩溃时的内存状态信息。它可以帮助程序员在调试程序时快速定位问题&#xff0c;并且是一种非常有用的调试工具。core dump的作用如下&#xff1a; 帮…

Java面向对象程序设计实验报告(实验二 面向对象基础练习)

✨作者&#xff1a;命运之光 ✨ 专栏&#xff1a;Java面向对象程序设计实验报告 目录 ✨一、需求设计 ✨二、概要设计 ✨三、详细设计 ✨四、调试结果 ✨五、测试结果 ✨附录&#xff1a;源程序代码&#xff08;带注释&#xff09; 测试类demo2 Address类 Employee类…

Docker之DockerFile相关基础知识

DockerFile相关基础知识 一、Docker镜像原理1、操作系统组成部分1.1 七大子系统1.2 Linux文件系统 2、Docker镜像原理介绍2.1 原理图2.2 Docker镜像本质2.3 统一文件系统2.4 复用性2.5 统一性 二、容器转为镜像1、Docker镜像的制作1.1 容器转换为镜像1.2 镜像转为压缩文件1.3 导…

【SpringBoot】三:访问数据库

文章目录 1.DataSource2.JdbcTemplate2.1 准备环境2.2 准备表和数据2.3 配置数据源2.4 JdbcTemplate访问mysql2.5 创建实体类 ArticlePO2.6 测试2.6.1 测试聚合函数 3.mybatis3.1 单表CRUMD3.1.1 创建模块3.1.2 查询3.1.3 插入3.1.4 更新3.1.5 删除 3.2 ResultMap3.3 SQL 提供者…

Elasticsearch 集群部署管理

Elasticsearch 集群配置版本均为8以上 安装前准备 CPU 2C 内存4G或更多 操作系统: Ubuntu20.04,Ubuntu18.04,Rocky8.X,Centos 7.X 操作系统盘50G 主机名设置规则为nodeX.qingtong.org 生产环境建议准备单独的数据磁盘主机名 #各自服务器配置自己的主机名 hostnamectl set-ho…

【2023/05/17】smalltalk

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第12天。 Share His own morning are new surprises to God. 译文&#xff1a; 神自己的清晨&#xff0c;在他自己看来也是新奇的。 Life finds its wealth by the claims of the world,and its worth…

基于UIAutomation+Python+Unittest+Beautifulreport的WindowsGUI自动化测试框架

1 main.py主入口 # -*- coding:utf-8 -*- # 作者&#xff1a;虫无涯 # 日期&#xff1a;2023/2/17 # 文件名称&#xff1a;main.py # 作用&#xff1a;框架的主入口函数# codingutf-8import time from common.reportOut import report_out from common.logOut import log_out …

Wandb.init和wandb.sweep的使用准则

目录 在使用 wandb.init() 初始化函数时&#xff0c;你可以包含以下信息&#xff1a; 如果在同一个代码中多次调用 wandb.init()&#xff0c;可能会导致以下问题&#xff1a; 如果你在一个大文件中使用了 wandb.init()&#xff0c;并且想在其他小文件中使用 wandb.log() 来记…

docker-compose部署sonarqube开源代码审计和分析平台

生成文件夹 mkdir -p /docker/sonar/postgres/postgresql mkdir -p /docker/sonar/postgres/datamkdir -p /docker/sonar/sonarqube chmod 777 -R /docker/sonar/sonarqube echo "vm.max_map_count262144" > /etc/sysctl.conf sysctl -p 创建docker-compose.yml文…

Kuberentes,k8s诞生简介

一、前言 什么是k8s&#xff1f; Kuberentes 是基于容器的集群管理平台&#xff0c;它的简称&#xff0c;是K8S。有人说之所以叫k8s&#xff0c;是因为k到s中间有8个字母&#xff0c;因此叫k8s&#xff0c;也有人说&#xff0c;在使用k8s的安装配置流程中&#xff0c;共分为8…

6年测开经验面试十家大厂,整理出来的笔记...

我第一次接触自动化是在2016年。那时刚毕业一年有余&#xff0c;组内一直做手工功能测试&#xff0c;大概在2018年9月&#xff0c;部门领导要求测试组引入自动化。组内之前从没有开展过任何自动化&#xff0c;测试主管安排了一个刚入职不久的研究生同事去研究。 当时自己内心还…

STM32独立按键扫描,支持同时按下、长按、快速键值

背景 有个项目在实际应用中&#xff0c;采用8个独立按键&#xff0c;每个按键都赋予不同功能&#xff0c;实际使用过程中很多时候都是需要比较特殊的按键操作&#xff0c;例如&#xff1a;长按10s按键、长按5s按键&#xff0c;或者长按需要有快速按键值的反馈&#xff0c;这个…

wordcloud背景图多图形演示

文章目录 前言一、问题二、多图层1.部分重叠1.1背景图1.2词云图 2.完全重叠2.1背景图2.2词云图 3.不重叠3.1背景图3.2词云图 三、不同形状1.背景图2.词云图 四、代码总结 前言 大家好&#xff0c;我是空空star&#xff0c;本篇给大家分享一下wordcloud背景图多图形演示。 一、问…

网络安全真的那么好吗?

近几年&#xff0c;随着网络安全被列为国家安全战略的一部分&#xff0c;这个曾经细分的领域发展提速了不少&#xff0c;除了一些传统安全厂商以外&#xff0c;一些互联网大厂也都纷纷加码了在这一块的投入&#xff0c;随之而来的吸引了越来越多的新鲜血液不断涌入。 网络安全…

多源环境(QGIS\PostgreSQL\ARCGIS\MAXENT\R语言)支持下的SolVES 模型生态系统服务功能社会价值评估

生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xff0c;对提升人类福祉具有重大意义&#xff0c;且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目&#xff08;Millennium Ecosystem Asse…

Python自动化测试实现的思路及方法

Python自动化测试常用于Web应用、移动应用、桌面应用等的测试 Python自动化实现思路通常分为以下几步&#xff1a; 1. 确定自动化测试的范围和目标&#xff1a; 首先需要明确需要进行自动化测试的范围和目标&#xff0c;包括测试场景、测试用例、测试数据等。 2. 选择自动化测…

Kubernetes第2天

第四章 实战入门 本章节将介绍如何在kubernetes集群中部署一个nginx服务&#xff0c;并且能够对其进行访问。 Namespace ​ Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 ​ 默认情况下&…