【C++】vector 基本使用(详解)

目录

一,vector 的介绍

二,vector 的定义

1,vector()

2,vector(size_type n, const value_type& val = value_type())

3,vector (const vector& x)

4,vector (InputIterator first, InputIterator last);

三,vector iterator 的使用

1,begin + end

2,rbegin + rend 

四,vector 空间增长问题

1,size

2,capacity

3,empty

4,reserve

5,resize

五,vector 增删查改

1,push_back

2,pop_back 

3,find

4,insert

5,erase

6,swap

7,operator[]


一,vector 的介绍

1,vector 是表示可变大小数组的序列容器。

2,就像数组一样,vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector 的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

3,本质讲,vector 使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector 并不会每次都重新分配大小。

4,vector 分配空间策略:vector 会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。

5,因此,vector 占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。

6,与其它动态序列容器相比(deque, list and forward_list), vector 在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起listforward_list 统一的迭代器和引用更好。

二,vector 的定义

1,vector()

无参构造

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

int main()
{
	vector<int> v1;
	return 0;
}

这里我们定义一个 vector 类,它里面的各种数据都是初始化了的,不是空就是0;

2,vector(size_type n, const value_type& val = value_type())

构造并初始化 n 个 val

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

int main()
{
	vector<int> v1(5, 6);
	for (int i = 0; i < 5; i++)
	{
		cout << v1[i]<<" ";
	}

	return 0;
}

直接自己定义初始化成 n 个 val;

3,vector (const vector& x)

拷贝构造

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

int main()
{
	vector<int> v1(5, 6);
	vector<int> v2(v1);
	for (int i = 0; i < 5; i++)
	{
		cout << v2[i]<<" ";
	}

	return 0;
}

拷贝构造嘛,都老朋友了;

4,vector (InputIterator first, InputIterator last);

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

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

int main()
{
	vector<int> v1(5,6);
	for (int i = 0; i < 5; i++)
	{
		v1[i] = i;
	}

	vector<int> v2(v1.begin()+1, v1.end()-1);
	for (int i = 0; i < 3; i++)
	{
		cout << v2[i] << " ";
	}

	return 0;
}

迭代器进行初始化构造,就是选取一段范围进行拷贝;

三,vector iterator 的使用

1,begin + end

获取第一个数据位置的 iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator

2,rbegin + rend 

获取最后一个数据位置的 reverse_iterator,获取第一个数据前一个位置的 reverse_iterator

诸位爱卿,我相信这张图对汝等足矣!

四,vector 空间增长问题

1,size

获取数据个数

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

int main()
{
	vector<int> v1(5, 6);
	cout << v1.size();

	return 0;
}

获取有效数据个数,不等同于容量,只是数据个数;

2,capacity

获取容量大小

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

int main()
{
	vector<int> v1(5, 6);
	cout << v1.capacity();

	return 0;
}

查看空间容量的,不等同于数据个数;

3,empty

判断是否为空,为空返回真,不为空返回 0;

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

int main()
{
	vector<int> v1(5, 6);
	vector<int> v2;
	cout << v1.empty()<<" "<<v2.empty();

	return 0;
}

4,reserve

改变 vector 的 capacity

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

int main()
{
	vector<int> v1(5, 6);
	cout << v1.capacity() << endl;

	v1.reserve(50);
	cout << v1.capacity() << endl;

	v1.reserve(20);
	cout << v1.capacity() << endl;

	v1.reserve(3);
	cout << v1.capacity() << endl;

	return 0;
}

兄弟们自己找找规律; 

5,resize

改变 vector 的 size

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

int main()
{
	vector<int> v1(5, 6);
	cout << v1.size() << " " << v1.capacity() << endl;

	v1.resize(20);
	cout << v1.size() << " " << v1.capacity() << endl;

	v1.resize(10);
	cout << v1.size() << " " << v1.capacity() << endl;

	return 0;
}

size()的值与 capacity 的值息息相关的,当 size()大于 capacity 时,capacity 会增大扩容;

五,vector 增删查改

1,push_back

尾插

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

int main()
{
	vector<int> v1(5, 6);
	v1.push_back(7);
	v1.push_back(8);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i]<<" ";
	}
	return 0;
}

2,pop_back 

尾删

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

int main()
{
	vector<int> v1(5, 6);
	v1.pop_back();
	v1.pop_back();
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i]<<" ";
	}
	return 0;
}

3,find

查找。(注意这个是算法模块实现,不是 vector 的成员接口)

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

int main()
{
	vector<int> v1{ 1,2,3,4,5 };
	auto pos = find(v1.begin(),v1.end(), 3);
	cout << *pos << endl;

	pos = find(v1.begin(), v1.end(), 5);
	cout << *pos;
	return 0;
}

在一个特点的范围里寻找一个数,然后返回指向这个数的迭代器;

4,insert

在 position 之前插入 val

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

int main()
{
	vector<int> v1{ 1,2,3,4,5 };
	auto pos = find(v1.begin(),v1.end(), 3);
	cout << *pos << endl;
	v1.insert(pos, 66);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	return 0;
}

在指定位置前插入特定的数;

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

int main()
{
	vector<int> v1{ 1,2,3,4,5 };
	auto pos = find(v1.begin(),v1.end(), 3);
	cout << *pos << endl;

	v1.insert(pos, 3, 77);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;

	return 0;
}

在指定位置前插入指定数量的数;

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

int main()
{
	vector<int> v1{ 1,2,3,4,5 };
	auto pos = find(v1.begin(),v1.end(), 3);
	cout << *pos << endl;

	v1.insert(pos, v1.begin(), v1.begin() + 2);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}

	return 0;
}

在指定位置前插入一段区间;

5,erase

删除 position 位置的数据

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

int main()
{
	vector<int> v1{ 1,2,3,4,5 };
	auto pos = find(v1.begin(), v1.end(), 3);
	cout << *pos << endl;
	
	v1.erase(pos);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	return 0;
}

删除某个指定位置的数据;

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

int main()
{
	vector<int> v1{ 1,2,3,4,5 };

	v1.erase(v1.begin(),v1.end()-1);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	return 0;
}

删除指定一段区间的数据;

6,swap

交换两个 vector 的数据空间

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

int main()
{
	vector<int> v1{ 0,1,2,3,4 };
	vector<int> v2{ 5,6,7,8,9 };

	v1.swap(v2);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v2[i] << " ";
	}
	return 0;
}

直接交换两边的数据;

7,operator[]

像数组一样访问

这个我们已经很熟悉了;

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

int main()
{
	vector<int> v1{ 0,1,2,3,4 };
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	return 0;
}

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

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

相关文章

IDEA 2022.2 安装教程

1.下载2020.3版本IDEA 链接&#xff1a;https://pan.baidu.com/s/1IFK8VRjT7vM2VM75ToveGQ?pwd176m 提取码&#xff1a;176m 2.安装 下载完成后&#xff0c;双击exe安装包&#xff0c;出现IDEA安装欢迎首页&#xff1a; 3.将 ja - netfiltet 文件复制到idea安装目录附件 …

Tailwind CSS 在Html中的使用

官网地址&#xff1a;Installation - Tailwind CSS 前言 记录从0到1在原生HTML中通过Tailwind CLI 使用Tailwind CSS Tailwind CLI 第一步&#xff0c;新建一个HTML文件夹 mkdir HTML 第二步&#xff0c;安装依赖tailwindcSS npm install -D tailwindcss 第三步&#xf…

SpringSercurity踩坑之request.getRequestURI()和request.getRequestURL()

今天在开发的时候遇到一个小小的问题&#xff0c;我在swagger测试权限的时候&#xff0c;直接跳过了放开的路径&#xff0c;直接进行了角色判断&#xff0c; .addFilterBefore(new TokenAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) 在这里if判断路径…

园林机械部件自动化三维测量检测形位公差-CASAIM自动化三维检测工作站

随着园林机械的广泛应用&#xff0c;对其机械部件的精确测量需求也日益增加。传统的测量方法不仅效率低下&#xff0c;而且精度难以保证&#xff0c;因此&#xff0c;自动化三维测量技术成为了解决这一问题的有效途径。本文将重点介绍CASAIM自动化三维检测工作站在园林机械部件…

mysql查询出json格式字段中的值

一、使用场景 由于一些特殊数据使用json格式保存到表数据种中了&#xff0c;在查询的时候需要查询出这条数据中json格式中的某个字段 比如&#xff1a;需要将下列字符串中的“nationality”字段单独查询出来 json格式是一个对象 结果&#xff1a; json格式是一个集合 查询结…

HarmonyOS云开发基础认证【题库答案】

HarmonyOS应用开发者基础认证【题库答案】 HarmonyOS应用开发者高级认证【题库答案】 一、判断题 应用架构的演进依次经历了微服务架构、单体架构、Serverless架构等阶段。&#xff08;错&#xff09;鸿蒙应用可以使用Arkts开发&#xff08;对&#xff09;认证服务在绑定微信账…

odoo17核心概念view5——ir_ui_view.py

这是view系列的第5篇文章&#xff0c;介绍一下view对应的后端文件ir_ui_view.py&#xff0c;它是base模块下的一个文件 位置&#xff1a;odoo\addons\base\models\ir_ui_view.py 该文件一共定义了三个模型 1.1 ir.ui.view.custom 查询数据库这个表是空的&#xff0c;从名字看…

spring security oauth2搭建认证服务器

如图&#xff08;上面图片的代码在业务项目中&#xff09;&#xff0c;第一步在独立的业务项目中&#xff0c;先获取授权码&#xff08;也叫jsessionId&#xff09;、获取授权码的路径就是 /oauth2/authorize&#xff0c;这个路径是oauth2的框架中被OAuth2AuthorizationEndpoin…

『JavaScript』全面解析JavaScript中的防抖与节流技术及其应用场景

&#x1f4e3;读完这篇文章里你能收获到 理解防抖&#xff08;Debouncing&#xff09;和节流&#xff08;Throttling&#xff09;的概念&#xff1a;了解这两种性能优化技术如何帮助我们更有效地处理频繁触发的事件掌握防抖与节流的实现方法&#xff1a;学习如何在JavaScript中…

【XR806开发板试用】XR806串口驱动CM32M对小厨宝的控制实验

一.说明 非常感谢基于安谋科技STAR-MC1的全志XR806 Wi-FiBLE开源鸿蒙开发板试用活动,并获得开发板试用。 XR806是全志科技旗下子公司广州芯之联研发设计的一款支持WiFi和BLE的高集成度无线MCU芯片&#xff0c;支持OpenHarmony minisystem和FreeRTOS&#xff0c;具有集成度高、…

岁末年终,收下谷歌开发者账号专属资料包

行至年末&#xff0c;感谢大家这一年对 "谷歌开发者" 的关注和支持&#xff0c;我们特在年终为大家梳理了资料包&#xff0c;帮助您做好整年知识点总结&#xff0c;精进开发技能&#xff0c;以更加从容的姿态迎接来年新光。 文章资料 我们一如既往地专注于为开发者们…

76 Python开发-内外网收集Socket子域名DNS

目录 Python开发相关知识点本篇文章涉及知识点演示案例:IP&Whois&系统指纹获取代码段-外网CDN&子域名&端口扫描&交互代码段-外网IP&计算机名&存活主机&端口扫描代码段-内网Py格式解析环境与可执行程序格式转换-Pyinstaller 涉及资源&#xff1…

L1-069:胎压监测

题目描述 小轿车中有一个系统随时监测四个车轮的胎压&#xff0c;如果四轮胎压不是很平衡&#xff0c;则可能对行车造成严重的影响。 让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序&#xff0c;随时监测四轮的…

【Vue】事件修饰符详解

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

SSL证书过期了怎么办

当SSL证书过期时&#xff0c;您需要尽快采取行动来确保您的网站继续提供安全的加密连接。以下是一些您可以采取的步骤&#xff1a; 更新证书&#xff1a; 尽快向您的SSL证书颁发机构申请并安装一个新的证书。如果您使用的是免费SSL证书&#xff08;比如Lets Encrypt&#xff0…

css+js实现鼠标移动边框高亮效果

前言&#xff1a;效果是鼠标移入空白区域&#xff0c;边框高亮的效果。效果是在douyin的渡一教育袁老师的课程学习到的&#xff0c;观看以后是一个实用的小特效。想看的可以平台查询&#xff0c;自己也学到了知识。 <!DOCTYPE html> <html lang"en"> <…

[RoarCTF2019] TankGame

不多说&#xff0c;用dnspy反编译data文件夹中的Assembly-CSharp文件 使用分析器分析一下可疑的FlagText 发现其在WinGame中被调用&#xff0c;跟进WinGame函数 public static void WinGame(){if (!MapManager.winGame && (MapManager.nDestroyNum 4 || MapManager.n…

060:vue中markdown编辑器mavon-editor的应用示例

第060个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

网站服务器被入侵,如何排查,该如何预防入侵呢?

在我们日常使用服务器的过程中&#xff0c;当公司的网站服务器被黑客入侵时&#xff0c;导致整个网站以及业务系统瘫痪&#xff0c;将会给企业带来无法估量的损失。作为服务器的维护人员应当在第一时间做好安全响应&#xff0c;对入侵问题做到及时处理&#xff0c;以最快的时间…