vector的相关概念及常用接口

vector的基本概念

功能:

vector容器与数组非常类似,也称单端数组(动态数组)

vector容器的内部结构图示

vector与普通数组之间的区别:

vector可以动态扩展,而普通数组是静态空间,一旦确定了大小就不能修改

动态扩展:

动态扩展并非是在原有空间接新空间(因为不知道后面空间的使用情况),而是找更大的内存空间,然后将原数据拷贝到新空间中,释放原空间

vector容器的迭代器是支持随机访问的迭代器(即可以进行+2,+n的操作)

vector构造函数

功能:对vector容器进行初始化操作

eg:

注:1、用vector时需包含头文件vector

2、常用的构造函数有无参构造和拷贝构造

vector赋值操作

功能:为vector容器赋值

eg:

vector容量和大小操作

总结:判断容器是否为空用成员函数empty,返回元素个数用size,返回容器容量用capacity,重新指定大小用resize。(注:容器容量永远大于等于容器元素个数)

eg:

#include<iostream>
using namespace std;
#include<vector>
void printVector(const vector<int>&v)//打印动态数组中的元素
{
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}
int main()
{
	vector<int>v;//默认构造,又称无参构造
	for (int i = 0; i < 5; i++)
	{
		v.push_back(i);//将i插入到动态数组中
	}
	if (v.empty())//若容器v为空,则返回true,否则返回false
	{
		cout << "容器vector为空" << endl;
	}
	else
	{
		cout << "vector容器不为空" << endl;
		printVector(v);//打印v中的元素
		cout << "容器v的大小为:" << v.size() << endl;
		cout << "容器v的容量为:" << v.capacity() << endl;
	}
	//v.resize(10);//若容器变长,则变长的位置默认填0
	//printVector(v);
	v.resize(10, 100);//可用resize的重载版本将变长位置的值改成其他的值
	printVector(v);
	cout << "容器v的容量为:" << v.capacity() << endl;
	v.resize(3);//若容器变短,则末尾超出容器长度的元素被删除
	printVector(v);
	system("pause");
	return 0;
}

测试结果: 

vector的插入与删除

各插入与删除操作与成员函数对应关系如下:

尾插--pop_back 、尾删--push_back、插入--insert(位置迭代器)、删除--erase(位置迭代器)、清空---clear

#include<iostream>
using namespace std;
#include<vector>
void printVector(const vector<int>&v)//打印动态数组中的元素
{
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}
int main()
{
	vector<int>v;//默认构造,又称无参构造
	for (int i = 0; i < 5; i++)
	{
		v.push_back(i);//尾插法
	}
	printVector(v);//打印数组中的元素
	v.pop_back();//尾删法--删除最后一个元素
	printVector(v);
	v.insert(v.begin()+2, 100);//将迭代器指针往起始位置向后偏移2个单位,并将100插入到此位置中
	printVector(v);
	v.insert(v.begin(), 2, 100);//insert的重载版本--将2个100插入到容器v的起始位置中
	printVector(v);
	v.erase(v.begin() + 4);//删除从起始位置向后偏移4个单位的元素
	printVector(v);
	v.erase(v.begin(), v.begin() + 2);//删除[v.begin(),v.begin()+2]之间的所有元素
	printVector(v);
	v.clear();//清空数组中所有元素
	printVector(v);
	system("pause");
	return 0;
}

vector数据存取

可以通过下标、成员函数at,front,back来访问vector中的元素

vector互换容器

用内置成员函数swap来实现两个vector容器的交换

实际应用:swap可以使两个容器互换,达到实用的收缩内存效果

eg:

#include<iostream>
using namespace std;
#include<vector>
int main()
{
	vector<int>v;
	for (int i = 0; i < 10000000; i++)//首先用尾插法将v的空间扩的非常大
	{
		v.push_back(i);//尾插法
	}
	cout << "容器的大小为:" << v.size() << endl;//结果为10000000
	cout << "容器的容量为:" << v.capacity() << endl;//11958657
	//现在resize将容器的大小变为3
	v.resize(3);
	cout << "容器的大小为:" << v.size() << endl;//结果为3
	cout << "容器的容量为:" << v.capacity() << endl;//11958657
	//可以发现容器的大小变为了3,但容器容量还为11958657,造成了大量的空间浪费,因此需用容器交换来解决
	vector<int>(v).swap(v);
	//vector<int>(v)表示创建了一个匿名对象,并用拷贝构造的方式将v的数据传给了此匿对象(设为x)。
	//vector<int>(v).swap(v)---将v与x进行交换,使得v指向x所指向的空间,x指向v所指向的空间。而匿名对象的特点就是执行完本行后,
	//所占空间会立即被回收。从而达到了收缩内存的效果
	cout << "容器的大小为:" << v.size() << endl;//结果为3
	cout << "容器的容量为:" << v.capacity() << endl;//输出结果同样为3
	system("pause");
	return 0;
}

vector预留空间

作用:若一开始就知道要插入很多的数,为了减少动态开辟的次数,可以在一开始就利用reserve预留空间。

eg:

#include<iostream>
using namespace std;
#include<vector>
void printVector(const vector<int>&v)//打印动态数组中的元素
{
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}
int main()
{
	vector<int>v;
	int count = 0;//用以统计数组动态增长的次数
	int*p=NULL;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
		if (p != &v[0])
		{
			p = &v[0];
			count++;
		}
	}
	cout << count << endl;//结果为30,说明动态增加到100000个数,需要动态开辟30次空间
	//若要减少动态开辟的次数,则可提前给v预留100000个空间,即
	vector<int>v1;
	v1.reserve(100000);
	count = 0;
	for (int i = 0; i < 100000; i++)
	{
		v1.push_back(i);
		if (p != &v1[0])
		{
			p = &v1[0];
			count++;
		}
	}
	cout << count << endl;//输出结果为1,大大减少了动态开辟内存造成的开销
	system("pause");
	return 0;
}

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

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

相关文章

STM32——ADC

STM32——ADC 1.ADC介绍 ADC是什么&#xff1f; 全称&#xff1a;Analog-to-Digital Converter&#xff0c;指模拟/数字转换器! ADC性能指标 量程&#xff1a;能测量的电压范围分辨率&#xff1a;ADC能辨别的最小模拟量&#xff0c;通常以输出二进制数的位数表示&#xf…

openGauss学习笔记-211 openGauss 数据库运维-高危操作一览表

文章目录 openGauss学习笔记-211 openGauss 数据库运维-高危操作一览表211.1 禁止操作211.2 高危操作 openGauss学习笔记-211 openGauss 数据库运维-高危操作一览表 各项操作请严格遵守指导书操作&#xff0c;同时避免执行如下高危操作。 211.1 禁止操作 表1中描述在产品的操…

python二维高斯热力图绘制简单的思路代码

import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter import cv2# 生成一个示例图像 image_size 100 image np.zeros((image_size, image_size))# 在图像中心创建一个高亮区域 center_x, center_y image_size // 2, image_size …

visual studio2022专业版安装步骤

目录 一、Visual studio下载二、创建C#项目——Hello World三、专业版秘钥激活 一、Visual studio下载 首先进入下载官网 先下载2022专业版&#xff0c;等等后面还需要选环境 我勾选了以下几个和c#开发有关的&#xff0c;后面缺什么还可以再安装所有以少勾了问题也不大 然后…

互联网加竞赛 基于深度学习的人脸表情识别

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸表情识别 该项目较…

解密数据清洗,SQL中的数据分析

大家好&#xff0c;数据库表中的数据经常会很杂乱。数据可能包含缺失值、重复记录、异常值、不一致的数据输入等&#xff0c;在使用SQL进行分析之前清洗数据是非常重要的。 当学习SQL时&#xff0c;可以随意地创建数据库表&#xff0c;更改它们&#xff0c;根据需要更新和删除…

《游戏-03_2D-开发》

基于《游戏-02_2D-开发》&#xff0c; 继续制作游戏&#xff1a; 首先要做的时切割人物Idle空闲状态下的动画&#xff0c; 在切割之前我们需要创建一个文件夹&#xff0c;用来存放动画控制器AnimatorContoller&#xff0c; 再创建一个人物控制器文件夹用来存放人物控制器&…

uniapp H5 touchstart touchend 切换背景会失效,或者没用

uniapp H5 touchstart touchend 切换背景会失效&#xff0c;或者没用 直接上代码 &#xff08;使用 class 以及 hover-class来设置样式&#xff09; class 设置默认的背景图或者样式 hover-class 来设置按下的背景图 或者样式 抬起 按下 <view class"mp_zoom_siz…

重写Sylar基于协程的服务器(1、日志模块的架构)

重写Sylar基于协程的服务器&#xff08;1、日志模块的架构&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、日志模…

力扣hot100 组合总和 回溯 剪枝 组合

Problem: 39. 组合总和 文章目录 思路复杂度&#x1f496; Code 思路 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) &#x1f496; Code class Solution{List<List<Integer>> res new ArrayList<>();int x;// 全局targetin…

18.通过telepresence调试部署在Kubernetes上的微服务

Telepresence简介 在微服务架构中,本地开发和调试往往是一项具有挑战性的任务。Telepresence 是一种强大的工具,使得开发者本地机器上开发微服务时能够与运行在 Kubernetes 集群中的其他服务无缝交互。本文将深入探讨 Telepresence 的架构、运行原理,并通过实际的案例演示其…

【Golang】ModbusRTU协议CRC16校验算法

CRC校验码是通过在数据后面附加一个短的校验序列来生成的&#xff0c;用于检测数据在传输过程中是否发生错误。CRC16是一种特定的CRC校验算法&#xff0c;它生成一个16位的校验码。 下面是使用Go语言实现CRC16校验算法的代码&#xff1a; package main import ("encoding…

ASP.NET Core 使用 SignalR 的简单示例

写在前面 ASP.NET SignalR 是一个开源代码库&#xff0c;简化了Web实时通讯方案&#xff0c;可以实时地通过服务端将信息同步推送到各个客户端&#xff0c;可应用于 需要从服务器进行高频更新的应用&#xff1a;包括游戏、社交网络、投票、拍卖、地图和GPS应用&#xff1b; 仪…

汽车燃油泵数据分析:全球市场的年复合增长率将达到10%左右

燃油泵是汽车配件行业的专业术语。是电喷汽车燃油喷射系统的基本组成之一&#xff0c;位于车辆油箱内部&#xff0c;燃油泵在启动和发动机运转时工作&#xff0c;如果发动机停止而点火开关仍处于ON时&#xff0c;HFM-SFI控制模块关闭燃油泵的电源&#xff0c;以避免意外点火。 …

【Vue.js设计与实现】第一篇:框架设计概览-阅读笔记(持续更新)

从高层设计的角度去探讨框架需要关注的问题。 参考&#xff1a;速读《Vue.js 设计与实现》 - 掘金 (juejin.cn) 系列目录&#xff1a; 标题博客第一篇&#xff1a;框架设计概览【Vue.js设计与实现】第一篇&#xff1a;框架设计概览-阅读笔记第二篇&#xff1a;响应系统【Vue.…

远程教育:低代码在教育技术领域的重塑之力

新冠肺炎大流行对世界各地的行业产生了影响&#xff0c;其中一些行业的影响远远超过其他行业。食品、零售、供应链、娱乐和航空业是受影响最大的行业&#xff0c;为确保不间断运营&#xff0c;这引发了一场数字革命。相信&#xff0c;这种数字化的采用将长期保持下去&#xff0…

如何使用 Google 搜索引擎保姆级教程(附链接)

一、介绍 "Google语法"通常是指在 Google 搜索引擎中使用一系列特定的搜索语法和操作符来精确地定义搜索查询。这些语法和操作符允许用户过滤和调整搜索结果&#xff0c;提高搜索的准确性。 二、安装 Google 下载 Google 浏览器 Google 官网https://www.google.c…

Android 使用高德地图

一、获取高德平台key 【1】基于application包名&sha1值在高德控制台获取key值&#xff0c;详情参考&#xff1a; 获取Key-创建工程-开发指南-Android 地图SDK | 高德地图API 【2】在manifest中声明权限 【3】将拿到的key值在manifest中进行声明 <!--允许程序打开网络…

沈阳地铁四号线部署智和信通运维方案,实现对工业交换机统一纳管

沈阳地铁4号线一期工程线路起于正新路站&#xff0c;途经和平区、沈河区、大东区、苏家屯区、浑南区&#xff0c;贯穿沈阳北站、沈阳南站、太原街、沈阳大学、长白岛、浑南产业区等区域&#xff0c;止于创新路站&#xff0c;大致呈南北走向。 项目现状 沈阳地铁4号线一期工程线…

点餐APP开发需要用到的一些源代码

在数字化日益普及的今天&#xff0c;点餐APP已经成为人们日常生活的重要组成部分&#xff0c;从校园食堂到高级餐厅&#xff0c;从快餐外卖到定制化营养餐&#xff0c;点餐APP的多样性和便利性满足了不同用户的需求&#xff0c;本文将深入探讨在开发一款点餐APP时可能用到的源代…