【C++】vector容器

0.前言

在这里插入图片描述
在这里插入图片描述

1.vector构造函数

加粗样式
在这里插入图片描述

#include <iostream>
using namespace std;
#include <vector>

void printVector(vector<int>& v) //此处&代表 引用 ;若取地址,则是 数据类型* 变量名
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//vector容器构造函数
void test01()
{
	vector<int>v1; //默认构造 无参构造

	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	//通过区间的方式进行构造 
	vector<int>v2(v1.begin(), v1.end());
	printVector(v2);

	//n个elem方式构造
	vector<int>v3(10, 100);
	printVector(v3);

	//拷贝构造
	vector<int>v4(v3);
	printVector(v4);
}

int main() {

	test01();
	//test02();

	//**************************************
	system("pause");
	return 0;
}

在这里插入图片描述

2.vector赋值操作

在这里插入图片描述

#include <iostream>
using namespace std;
#include <vector>

//vector赋值操作

void printVector(vector<int>& v) //&代表引用 ; 数据类型* 变量名 指的是取址
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//vector赋值
void test01()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	//赋值 operator=
	vector<int>v2;
	v2 = v1;
	printVector(v2);

	//assign
	vector<int>v3;
	v3.assign(v1.begin(), v1.end());
	printVector(v3);

	//n个elem 方式赋值
	vector<int>v4;
	v4.assign(10, 100);
	printVector(v4);
}

int main() {

	test01();
	//test02();

	//**************************************
	system("pause");
	return 0;
}

在这里插入图片描述
在这里插入图片描述

3.vector容量和大小

在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;
#include <vector>

//容器输出
void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//vector容器的容量和大小的操作
void test01()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	if (v1.empty()) 
	{
		cout << "v1为空" << endl;
	}
	else
	{
		cout << "v1不为空" << endl;
		cout << "v1的容量为:" << v1.capacity() << endl;
		cout << "v1的大小为:" << v1.size() << endl;
	}

	//重新指定大小
	v1.resize(15);
	printVector(v1); //如果重新指定的比原来长了,默认用0填充新的位置

	v1.resize(18, 100);
	printVector(v1); //利用重载版本,可以指定默认填充值,参数2:100

	v1.resize(5);
	printVector(v1); //如果重新指定的比原来短了,超出部分会删除掉
}

int main() {

	test01();
	//test02();

	//**************************************
	system("pause");
	return 0;
}

在这里插入图片描述

4.vector插入和删除

在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;
#include <vector>

//vector插入和删除
void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int> v1;
	//尾插
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	printVector(v1); //打印输出v1

	//尾删
	v1.pop_back();
	printVector(v1);

	//插入 第一个参数是迭代器
	v1.insert(v1.begin(), 100);
	printVector(v1);

	v1.insert(v1.begin(), 2, 200); //第二个参数:2,指的是插入2个200
	printVector(v1);

	//删除, 参数也是迭代器
	v1.erase(v1.begin());
	v1.erase(v1.end() - 1);
	printVector(v1);
	//v1.erase(v1.end()); //错误!!v1.end()指的是最后一个元素的后一位,无法执行删除指令
	/*v1.erase(v1.rend()) 是一个错误的代码。
	rend() 返回的是一个逆向迭代器,
	指向容器的逆序结尾(即指向最后一个元素的下一个位置)。
	erase() 函数需要传入正向迭代器来删除元素,所以不能直接使用 rend()。
	如果你想删除 v1 容器中的最后一个元素,可以使用以下代码:
		if (!v1.empty()) {
			v1.erase(v1.end() - 1);
		}
	这里的 end() 返回的是一个正向迭代器,指向容器的末尾位置,减去 1 后指向最后一个元素。
	然后使用 erase() 函数将该元素删除。
	请注意,在删除元素之前,最好先检查容器是否为空,以避免访问越界的情况发生。*/

	//清空
	//v1.erase(v1.begin(), v1.end());
	v1.clear();  //1、clear:清空;清除;澄清;放晴;使明确   2、clean:打扫;清扫;擦,刷
	printVector(v1);
}

int main() {

	test01();
	//test02();

	//**************************************
	system("pause");
	return 0;
}

在这里插入图片描述

5.vector数据存取

在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;
#include <vector>

//vector数据存取
void test01()
{
	//创建向量v
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}

	//利用[]方式访问数组中元素
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;

	//利用at方式访问元素
	for (int i = 0; i < v.size(); i++)
	{
		cout << v.at(i) << " ";
	}
	cout << endl;

	//获取第一个和最后一个元素
	cout << "第一个元素: \t" << v.front() << endl;
	cout << "最后一个元素:\t" << v.back() << endl;
}

int main() {

	test01();
	//test02();

	//**************************************
	system("pause");
	return 0;
}

在这里插入图片描述

6.vector互换容器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;
#include <vector>

//vector互换容器

void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//1、基本使用
void test01()
{
	vector<int>v1,v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	cout << "交互前:" << endl;
	printVector(v1);

	for (int i = 10; i > 0; i--)
	{
		v2.push_back(i);
	}
	printVector(v2);
	
	v1.swap(v2);
	cout << "互换后:" << endl;
	printVector(v1);
	printVector(v2);
}

//2、实际用途
//巧用swap可以收缩内存空间
void test02()
{
	vector<int>v;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
	}

	cout << "v的容量为:" << v.capacity() << endl;
	cout << "v的大小为:" << v.size() << endl;

	v.resize(3);  //重新指定大小
	cout << "重新指定大小后:" << endl;
	cout << "v的容量为:" << v.capacity() << endl;
	cout << "v的大小为:" << v.size() << endl;

	//巧用swap收缩内存
	vector<int>(v).swap(v);
	cout << "互换后:" << endl;
	cout << "v的容量为:" << v.capacity() << endl;
	cout << "v的大小为:" << v.size() << endl;
}

int main() {

	test01();
	test02();

	//**************************************
	system("pause");
	return 0;
}

在这里插入图片描述

7.vector预留空间

在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;
#include <vector>

//vector容器 预留空间

void test01()
{
	vector<int>v;

	//利用reserve预留空间
	v.reserve(100000);

	int* p = NULL;
	int num = 0;//统计空间开辟次数
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
		if (p != &v[0])
		{
			p = &v[0];
			num++;
		}
	}

	cout << "num = " << num << endl;
}


int main() {

	test01();
	//test02();

	//**************************************
	system("pause");
	return 0;
}

在这里插入图片描述

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

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

相关文章

Apache-Maven

安装Maven 解压apache-maven到目录下 Maven目录如下 bin&#xff1a;目录中存放的是可执行文件&#xff0c;JAVA项目中的编译执行打包都要使用bin. conf:存放的是Maven的配置文件&#xff0c;本地配置、私服配置都需要在conf下的settings.xml进行配置。 lib下存放的是Maven所…

C++学习| MFC简单入门

前言&#xff1a;因为接手了CMFC的程序&#xff0c;所以需要对MFC编程方面有所了解。 C之MFC简单入门 MFC相关的概念MFCWIN32QT MFC项目基本操作MFC项目创建MFC项目文件解读界面和代码数据交互——加法器 MFC相关的概念 MFC MFC&#xff08;Microsoft Foundation Classes微软…

湖仓一体:国产基础软件的创新突破与弯道超车

在这个市场变化和技术演进的时期&#xff0c;传统的国内外巨头优势被减弱&#xff0c;具备创新技术的国产基础软件企业&#xff0c;有希望实现弯道超车。 随着数字化转型进程的加快&#xff0c;企业对于数据基础设施的存储和计算能力要求越来越高。如何进行数据资产的统一管理和…

Postman下载教程

目录 下载 安装 注意事项 看到很多小伙伴在问 Postman 下载的相关问题&#xff0c;花时间整理了下&#xff0c;下面教新入门的小伙伴如何去下载 Postman。 开始前我们可以先了解下&#xff1a;Postman 简介 下载 第一步&#xff1a;进入 Postman 官网 首先&#xff0c;我…

【前端|Javascript第4篇】详解Javascript的事件模型:小白也能轻松搞懂!

前言 在当今数字时代&#xff0c;前端技术正日益成为塑造用户体验的关键。而其中一个不可或缺的核心概念就是JavaScript的事件模型。或许你是刚踏入前端领域的小白&#xff0c;或者是希望深入了解事件模型的开发者&#xff0c;不论你的经验如何&#xff0c;本篇博客都将带你揭开…

Multi-object navigation in real environments using hybrid policies 论文阅读

论文信息 题目&#xff1a;Multi-object navigation in real environments using hybrid policies 作者&#xff1a;Assem Sadek, Guillaume Bono 来源&#xff1a;CVPR 时间&#xff1a;2023 Abstract 机器人技术中的导航问题通常是通过 SLAM 和规划的结合来解决的。 最近…

IDEA常用设置与maven项目部署

目录 前言 一、Idea是什么 二、Idea的优点 三、Idea的常用设置 主题设置 设置鼠标悬浮提示 忽略大小写提示 自动导包 取消单行显示Tabs 设置字体 配置类文档注释信息模版 设置文件编码 设置自动编译 水平或者垂直显示代码 快捷方式改成eclipse 设置默认浏览器…

LeetCode150道面试经典题-- 有效的字母异位词(简单)

1.题目 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 2.示例 s"adasd" t"daads" 返回true s"addad" t &q…

Oracle 增加重做日志组、组成员

重做日志文件记录数据所有的修改信息并提供一种数据库失败时的恢复机制 一个Oracle数据库要求至少有两组重做日志文件 组中每个日志文件被称作一个组成员 需求&#xff1a;目前有三组重做日志组&#xff0c;增加一个重做日志组、并且增加两个重做日志组成员 1、查看重做日志组…

学习笔记整理-JS-04-流程控制语句

文章目录 一、条件语句1. if语句的基本使用2. if else if多条件分支3. if语句算法题4. switch语句5. 三元运算符 二、循环语句1. for循环语句2. for循环算法题3. while循环语句4. break和continue5. do while语句 三、初识算法1. 什么是算法2. 累加器和累乘器3. 穷举法4. 综合算…

Python爬虫的requests(学习于b站尚硅谷)

目录 一、requests  1. requests的基本使用  &#xff08;1&#xff09;文档  &#xff08;2&#xff09;安装  &#xff08;3&#xff09;响应response的属性以及类型  &#xff08;4&#xff09;代码演示 2.requests之get请求  3. requests之post请求  &#x…

面试八股文Mysql:(1)事务实现的原理

1. 什么是事务 事务就是一组数据库操作&#xff0c;这些操作是一个atomic&#xff08;原子性的操作&#xff09; &#xff0c;不可分割&#xff0c;要么都执行&#xff0c;要么回滚&#xff08;rollback&#xff09;都不执行。这样就避免了某个操作成功某个操作失败&#xff0…

centos7 nginx1.18.0离线升级至1.25.1

centos7 nginx1.18.0离线升级至1.25.1 项目背景 系统&#xff1a;centos 7 nginx版本&#xff1a; 1.18.0 最近护网行动查出来 有关Nginx的几个安全漏洞&#xff0c;解决方案只需要更新Nginx版本到最新即可。 Nginx升级过程 1. 下载新版本nginx 下载地址&#xff1a;https:…

学习笔记整理-JS-06-函数

一、函数基本使用 1. 什么是函数 函数就是语句的封装&#xff0c;可以让这些代码方便地被复用。函数具有"一次定义&#xff0c;多次调用"的优点。使用函数&#xff0c;可以简化代码&#xff0c;让代码更具有可读性。 2. 函数的定义和调用 和变量类似&#xff0c;函…

选择最适合自己的笔记本

选择最适合自己的笔记本电脑 一、了解笔记本品牌一线品牌准一线品牌二线品牌三线品牌 二、笔记本入手渠道笔记本入手渠道 三、根据需求选择机型使用需求1.日常使用2.商务办公、财务3.轻度剪辑、ps4.代码5.创意设计6.游戏 四、笔记本电脑配置如何选1.cpu2.显卡&#xff08;GPU&a…

MSP432自主开发笔记6:定时器多通道捕获多条编码器线脉冲数

所用开发板&#xff1a;MSP432P401R 今日在此更新一下编码器测速的定时器捕获写法&#xff0c;之前学习时竟然忘记更新了~~ 本文讲如何用定时器的通道来 捕获编码器的脉冲信号数量&#xff0c;不提供速度路程的计算方式&#xff0c; 文章提供源码&#xff0c;测试工程下载&a…

Jmeter 参数化的几种方法

目录 配置元件-用户自定义变量 前置处理器-用户参数 配置元件-CSV Data Set Config Tools-函数助手 配置元件-用户自定义变量 可在测试计划、线程组、HTTP请求下创建用户定义的变量 全局变量&#xff0c;可以跨线程组调用 jmeter执行的时候&#xff0c;只获取一次&#xff0…

PromQL实现Actuator获取的JVM指标的Full GC次数监控

Spring Boot 版本需要2.0.0或更高版本。 添加Micrometer Prometheus registry依赖: <dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId> </dependency>在application.properties中开…

linux-删除KVM虚拟机

1.查看主机 #virsh list 2.关闭主机 #virsh shutdown 虚拟机名称 3.删除主机定义 #virsh undefine 虚拟机名称 4.删除KVM虚拟机文件 #find / -name 虚拟机名称 #rm -rf 虚拟机文件

WebSocket与消息推送

B/S结构的软件项目中有时客户端需要实时的获得服务器消息&#xff0c;但默认HTTP协议只支持请求响应模式&#xff0c;这样做可以简化Web服务器&#xff0c;减少服务器的负担&#xff0c;加快响应速度&#xff0c;因为服务器不需要与客户端长时间建立一个通信链接&#xff0c;但…