STL常用容器(2)---vector容器

news2025/1/18 1:52:42

1.1 vector基本概念

功能:

  • vector数据结构和数组非常相似,也称为单端数组

vector与普通数组区别:

  • 不同之处在于数组是静态空间,而vector可以动态扩展

动态扩展:

  • 并不是在原空间之后的续接的新空间,而是找更大的内存空间,然后将元数据拷贝新空间,释放原空间

  • vector容器的迭代器是支持随机访问的迭代器

1.2 vector构造函数

功能描述:

  • 创建vector容器

函数原型:

  • vector<T> v;                            //采用模板实现类实现,默认构造函数
  • vector(v.begin(),v.end());         //将v[begin(),end()]区间中的元素拷贝给元素
  • vector(n,elem);                        //构造函数将n个elem拷贝给本身
  • vector(const vector &vec);      //拷贝构造函数

示例:

#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();
	system("pause");
	return 0;
}

总结:vector的多种构造方式没有可比性,灵活使用即可 

1.3 vector赋值操作

给vector容器赋值

函数原型:

  • vector& operator=(const vector &vec);//重载等号操作符
  • assign(beg,end);                                 //将[beg,end]区间中的数据拷贝赋值给本身
  • assign(n,elem);                                    //将n个elem拷贝赋值给本身

示例:

#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);

	//赋值 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();
	system("pause");
	return 0;
}

总结:vector赋值方式比较简单,使用operator=,或者assign都可以 

1.4 vector容量和大小

对vector容量和大小进行操作

函数原型:

  • empty();                       //判断容器是否为空
  • capacity();                   //容器的容量
  • size();                          //返回容器中元素的个数
  • resize(int num);         //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
  •                                     //如果容器变短,则末尾超出容器长度的元素被删除
  • resize(int num,elem);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
  •                                     //如果容器变短,则末尾超出容器长度的元素被删除

示例:

#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, 100);//利用重载版本,可以指定默认填充值,参数二
	printVector(v1);//如果重新指定的比原来长了,默认用0填充新的位置

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

}
int main()
{
	test01();
	system("pause");
	return 0;
}

 

总结:

  • 判断是否为空---empty
  • 判断元素个数---size
  • 判断容器容量---capacity
  • 判断指定大小--resize 

1.5 vector插入和删除

对vector插入和删除操作

函数原型:

  • push_back(ele);            //尾部插入元素ele
  • pop_back();                  //删除最后一个元素
  • insert(const_iterator pos,ele);//迭代器指向位置pos插入ele
  • insert(const_iterator pos,int count,ele);//迭代器指向位置pos插入count个元素ele
  • erase(const_iterator pos);//删除迭代器指向的元素
  • erase(const_iterator start,const_iterator end);删除迭代器从start到end之间的元素
  • clear();                              //删除迭代器所有元素

示例:

#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;
}
void test01()
{
	vector<int>v1;
	//尾插
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);

	//遍历
	printVector(v1);

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

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

	v1.insert(v1.end(), 2, 1000);
	printVector(v1);

	//删除  参数是迭代器
	v1.erase(v1.begin());
	printVector(v1);

	v1.erase(v1.begin(),v1.end ());
	printVector(v1);
    //v1.clear();
    //printVector(v1);

}
int main()
{
	test01();
	system("pause");
	return 0;
}

 总结:

  1. push_back 尾插
  2. pop_back 尾删
  3. insert 插入
  4. erase 删除
  5. clear 清空

1.6 vector数据存取

函数原型:

  1. at(int idx);                  //返回索引idx所指向的数据
  2. operator[]                  //返回索引idx所指向的数据
  3. front();                       //返回容器中第一个数据元素
  4. back();                       //返回容器中最后一个数据元素

示例:

#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;
}

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

	//利用[]方式访问元素
	for (int i = 0; i < 10; i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;

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

	//获取第一个元素
	cout << "第一个元素为" << v1.front() << endl;

	//获取最后一个元素
	cout << "最后一个元素为" << v1.back() << endl;

}

int main()
{
	test01();
	system("pause");
	return 0;
}

总结:

  1. 除了用迭代器访问元素,用[]和at也可以
  2. front()返回第一个元素
  3. back()返回最后一个元素 

1.7 vector互换容器

目的:实现两个容器内元素进行互换

函数原型:

  • swap(vec);   //将vec与本身的元素互换

示例:

#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;
}

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

	vector<int>v2;
	for (int i = 10; i > 0; i--)
	{
		v2.push_back(i);
	}
	printVector(v2);

	cout << "交换后" << endl;
	v1.swap(v2);
	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;
	cout << endl;

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

	//巧用swap可以收缩内存空间容量
	vector<int>(v).swap(v);
	cout << "v的容量" << v.capacity() << endl;
	cout << "v的大小" << v.size() << endl;
}

int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}

总结:

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

1.8 vector 预留空间

功能描述:

减少vector在动态扩展容量的扩展次数

函数模型:

reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问

示例:

预留空间前:

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

void test01()
{
	vector<int>v;

	//预留空间
	//v.reserve(10000);

	int num = 0;
	int* p = NULL;
	for (int i = 0; i < 10000; i++)
	{
		v.push_back(i);
		if (p != &v[0])
		{
			p = &v[0];
			num++;
		}
	}
	cout << "num= " << num << endl;
}
int main()
{
	test01();
	system("pause");
	return 0;
}

 预留空间后:

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

void test01()
{
	vector<int>v;

	//预留空间
	v.reserve(10000);

	int num = 0;
	int* p = NULL;
	for (int i = 0; i < 10000; i++)
	{
		v.push_back(i);
		if (p != &v[0])
		{
			p = &v[0];
			num++;
		}
	}
	cout << "num= " << num << endl;
}
int main()
{
	test01();
	system("pause");
	return 0;
}

解释:未预留空间时,可访问的元素较多,预留空间后,该空间的元素不可访问,可访问的元素会变少

总结:如果数据量变大,可以一开始利用reserve预留空间 

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

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

相关文章

腾讯云4核8G配置的服务器有哪些优惠?价格好不?

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

邀请媒体采访报道对企业宣传有何意义?

传媒如春雨&#xff0c;润物细无声的&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 邀请媒体采访报道对企业宣传具有多重意义&#xff1a; 提升品牌知名度和曝光度&#xff1a;媒体是信息传播的重要渠道&#xff0c;通过媒体的报道&#xff0c;企业及其活动、产品能够…

SpringBoot整合Flowable/Activiti

SpringBoot版本: 2.0.1.RELEASE Flowable版本: 6.3.1 Activiti版本: 6.0.0 一.添加pom依赖 因为之前我整合的时候有报错关于sqlsession的错误,后面查询文章才发现flowable要排除掉mybatis,又没说具体排除哪一个,所以我这干脆全部排除了 <!-- Flowable dependencies -->…

Servlet 的基本理解

Servlet 是JavaEE规范的一种&#xff0c;主要是为了扩展Java作为Web服务的功能&#xff0c;统一接口。由其他内部厂商如tomcat&#xff0c;jetty内部实现web的功能。如一个http请求到来&#xff1a;容器将请求封装为servlet中的HttpServletRequest对象&#xff0c;调用init()&a…

Spring Security 实现后台切换用户

Spring Security version 后端代码&#xff1a; /*** author Jerry* date 2024-03-28 17:47* spring security 切换账号*/RestController RequiredArgsConstructor RequestMapping("api/admin") public class AccountSwitchController {private final UserDetailsSe…

即将截稿 CCF-A多媒体顶会ACM MM‘24 北京时间4月9日提交摘要

会议之眼 快讯 第32届ACM MM (ACM MULTIMEDIA)即国际多媒体会议将于 2024 年 10月28 -日11月1日在澳大利亚墨尔本隆重举行&#xff01;MM是由ACM&#xff08;Association for Computing Machinery&#xff0c;计算机协会&#xff09;主办的国际性学术会议&#xff0c;是计算机…

应对苹果商店审核失败:解决Flutter应用被拒绝的常见情况与解决方案

引言 Flutter是一款由Google推出的跨平台移动应用开发框架&#xff0c;其强大的性能和流畅的用户体验使其备受开发者青睐。然而&#xff0c;开发一款应用只是第一步&#xff0c;将其成功上架到苹果商店才是实现商业目标的关键一步。本文将详细介绍如何使用Flutter将应用程序上…

Day81:服务攻防-开发框架安全SpringBootStruts2LaravelThinkPHPCVE复现

目录 PHP-框架安全-Thinkphp&Laravel Laravel CVE-2021-3129 RCE Thinkphp 版本3.X RCE-6.X RCE 版本6.X lang RCE J2EE-框架安全-SpringBoot&Struts2 Struct2 旧漏洞(CVE-2016-0785等) struts2 代码执行 &#xff08;CVE-2020-17530&#xff09;s2-061 Str…

为什么要学习数学/科学史?

一、说明 哈代的经典著作《数学家的道歉》&#xff0c;他在书中为自己选择的数学职业辩护&#xff0c;他坦诚了自己一生贡献之微不足道。事实是&#xff0c;哈代没什么可道歉的。哈代是一位真正的顶级数学家&#xff0c;完全有资格获得他选择的头衔&#xff0c;并且以伯乐之能…

HarmonyOS NEXT应用开发之ForEach:循环渲染

ForEach接口基于数组类型数据来进行循环渲染&#xff0c;需要与容器组件配合使用&#xff0c;且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如&#xff0c;ListItem组件要求ForEach的父容器组件必须为 List组件 。 说明&#xff1a; 从API version 9开始&a…

蓝桥杯嵌入式备考笔记

keil配置 LED-KEY-LCD 留下这几个 按键 创建俩个文件写代码&#xff0c;记得把这两个文件加进工程 led uwTick 1ms执行一次 写错了 不是1000 是100 PD2 SET 表示打开锁存器 可以操作LED LED对应PC引脚拉高是熄灭 key 如果要在main使用需要extern LCD最多21位 …

C语言进阶课程学习记录-第21课 - 宏定义与使用分析

C语言进阶课程学习记录-第21课 - 宏定义与使用分析 宏定义的本质实验-字面量比较宏定义表达式实验-表达式有效性宏的作用域实验-作用域分析内置宏内置宏演示小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学…

012:vue3使用vue-i18n实现国际化

文章目录 1. 安装 vue-i18n2. 创建文件存储翻译的语言3. 注册i18n实例4. 在main.ts中引入vue-i18n实例5. 在组件模板中使用6. 在js中使用7. locale.value 实现国际化语言切换8. vue3 中ref里面的国际化值没生效问题 1. 安装 vue-i18n cnpm i --save vue-i18n2. 创建文件存储翻…

进销存管理系统:食品批发零售迈向数字化未来-亿发

随着消费逐步复苏&#xff0c;食品批发零售行业也迎来了客流的回升&#xff0c;实体店重新焕发了生机。然而&#xff0c;随着数字化时代的来临&#xff0c;传统的食品批发零售企业面临着新的挑战和机遇。些企业正积极实施数字化转型&#xff0c;通过布局线上线下多业态的融合发…

jQuery(一)

文章目录 1. 基本介绍2.原理示意图3.快速入门1.下载jQuery2.创建文件夹&#xff0c;放入jQuery3.引入jQuery4.代码实例 4.jQuery对象与DOM对象转换1.基本介绍2.dom对象转换JQuery对象3.JQuery对象转换dom对象4.jQuery对象获取数据获取value使用val&#xff08;&#xff09;获取…

翻译: 硅谷软件工程师面试:准备所需的一切

没有人有时间去做成百上千道LeetCode题目&#xff0c;好消息是你实际上并不需要做那么多题目就能够在FAANG公司找到工作&#xff01; 我曾经在Grab工作&#xff0c;这是东南亚的一家共享出行公司&#xff0c;但我对工作感到沮丧&#xff0c;想要进入FAANG公司&#xff0c;但我…

编译好的C++应用程序拷贝到其它电脑,提示dll未找到依赖项的解决方法。

编译好的C应用程序拷贝到其它电脑上&#xff0c;运行时出现提示dll未找到依赖项。 由于dll依赖于其它dll&#xff0c;在开发用电脑上的环境不能完全与其它电脑相同。 解决办法是找到调用到的dll依赖的所有dll&#xff0c;拷贝到运行目录下。 在开发电脑上&#xff1a; 1、开…

一款功能强大且易于使用的视频剪辑应用程序

一款功能强大且易于使用的视频剪辑应用程序&#xff0c;它提供了丰富多样的转场特效和滤镜&#xff0c;让用户能够轻松地为视频添加各种炫酷的效果。与其他视频编辑软件相比&#xff0c;剪映国际版的最大亮点在于其完全免费使用。首先&#xff0c;剪映国际版为用户提供了丰富的…

ChatGPT/GPT4科研应用与绘图技术及论文写作

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

初识MySQL(中篇)

使用语言 MySQL 使用工具 Navicat Premium 16 代码能力快速提升小方法&#xff0c;看完代码自己敲一遍&#xff0c;十分有用 目录 1.SQL语言 1.1 SQL语言组成部分 2.MySQL数据类型 2.1 数值类型 2.2 字符串类型 2.3 日期类型 3.创建数据表 3.1 创建数据表方法1 …