【C++】vector介绍

个人主页 : zxctscl
如有转载请先通知

文章目录

  • 1. 前言
  • 2. vector的介绍
  • 3. Member functions
    • 3.1 (constructor)
    • 3.2 (destructor)
  • 4. Capacity
    • 4.1 resize
    • 4.2 reserve
    • 4.3 shrink_to_fit
  • 5. vector 增删查改
    • 5.1 push_back
    • 5.2 insert
    • 5.3 pop_back
    • 5.4 find
    • 5.5 erase

1. 前言

在之前已经介绍了string类 【C++】string类初步介绍和【C++】string进一步介绍,这次来看看C++中的顺序表vector。

2. vector的介绍

在这里插入图片描述

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

3. Member functions

在这里插入图片描述

3.1 (constructor)

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

构造有: vector<int> v;

   vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	for (size_t i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;

在这里插入图片描述
还有在构造的时候直接赋值vector<int>v(10, 1);构造一个int类型的顺序表开了10个空间,这10个空间初始化为1:
在这里插入图片描述

3.2 (destructor)

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

4. Capacity

在这里插入图片描述

4.1 resize

在这里插入图片描述
resize开一个空间,空间开好了以后,进行填值初始化。

举个例子:开10个空间,然后初始化为0:

    vector<int> a;
	a.resize(10, 0);
	for (auto e : a)
	{
		cout << e << " ";
	}
	cout << endl;

在这里插入图片描述

4.2 reserve

在这里插入图片描述
来看看vector的扩容机制:

void test_vector2()
{
	size_t sz;
	vector<int> v;
	sz = v.capacity();
	cout << "making v grow:\n";
	for (int i = 0; i < 100; ++i)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
}

在这里插入图片描述
这里是以1.5倍扩容,不过这里取整了。
如果不想扩容发生,就用reserve提前先开好空间。

void test_vector2()
{
	size_t sz;
	vector<int> v;
	v.reserve(100);
	sz = v.capacity();
	cout << "making v grow:\n";
	for (int i = 0; i < 100; ++i)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
}

这样就不用扩容了:
在这里插入图片描述
在这里插入图片描述

一般来说resize和reserve都不会缩容:

size_t sz;
	vector<int> v;
	v.reserve(100);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
	v.reserve(10);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
	
	cout << "-----------------" << endl;
	cout << v.size() << endl;
	cout << v.capacity() << endl;
	v.resize(10);
	cout << v.size() << endl;
	cout << v.capacity() << endl;

在这里插入图片描述

4.3 shrink_to_fit

要想缩容就调用这个接口shrink_to_fit
在这里插入图片描述

    
	vector<int> v;
	v.reserve(100);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
	v.reserve(10);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
	
	cout << "-----------------" << endl;
	cout << v.size() << endl;
	cout << v.capacity() << endl;
	v.resize(10);
	cout << v.size() << endl;
	cout << v.capacity() << endl;

	cout << "-----------------" << endl;
	v.shrink_to_fit();
	cout << v.size() << endl;
	cout << v.capacity() << endl;

这样就实现了缩容:
在这里插入图片描述

5. vector 增删查改

5.1 push_back

在这里插入图片描述
vector只支持单个数据的尾插。
直接来看看代码:

#include<iostream>
using namespace std;

#include<vector>
int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	for (size_t i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;

	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

5.2 insert

在这里插入图片描述
来试试头插:

    vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	v.insert(v.begin(), 0);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

在这里插入图片描述
也可以插入一段迭代区间:

    vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	v.insert(v.begin(), 0);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	string s("abcd");
	v.insert(v.begin(), s.begin(),s.end());
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

这里隐私类型转换,将abcd转换为对应的ascii值:
在这里插入图片描述

5.3 pop_back

尾删
在这里插入图片描述
来看看代码:

vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

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

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

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

在这里插入图片描述

5.4 find

在这里插入图片描述
在vector里面发现没有find,如果我们想要使用find来查找,那么就得用到算法库里面的就行。使用它得包含一个头文件:#include<algorithm>
在这里插入图片描述
举个例子:在3位置插入30

#include<iostream>
#include<algorithm>
using namespace std;
#include<vector>
int main()
{
    vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	vector<int>::iterator pos=find(v.begin(), v.end(), 3);
	if (pos != v.end())
	{
		v.insert(pos, 30);
	}

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

在这里插入图片描述

5.5 erase

在这里插入图片描述
举个例子删除3位置:

    vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	vector<int>::iterator pos = find(v.begin(), v.end(), 3);
	if (pos != v.end())
	{
		v.erase(pos);
	}
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

在这里插入图片描述

有问题请指出,大家一起进步!!!

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

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

相关文章

Windows Docker 部署 MongoDB 数据库

部署 MongoDB 打开 Docker Desktop&#xff0c;切换到 Linux 容器。然后在 PowerShell 执行下面命令&#xff0c;即可启动一个 MongoDB 服务。这里安装的是 7.0.7 Tag版本&#xff0c;如果需要安装其他或者最新版本&#xff0c;可以到 Docker Hub 进行查找。 docker run -d -…

基于 Amazon Bedrock 的 Claude 3 体验:ChatGPT 已经 OUT 了吗?Claude 3 数据实测

文章目录 前言一、Claude 3 系列大模型开发团队二、基于 Amazon Bedrock 的 Claude 3 体验三、Claude 3 数据实测3.1、申请模型访问权限3.2、Claude 3 回答的严谨性3.3、验证 Claude 3 较于 ChatGPT-4 数据集更新时间3.4、“二分法”判断 Claude 3 训练数据截止时间3.5、综合二…

瑞吉外卖实战学习--登录过滤器和判断是否登录过

完善登录功能 1、创建自定义过滤器LoginCheckFiler1.1通过WebFilter创建过滤器1.2 验证是否可以拦截请求1.3 代码 2、在启动类加入注解ServletComponentScan 用来扫描过滤器触发所有的过滤器ServletComponentScan 3、完善过滤器的处理逻辑3.1判断是否需要是要放行的请求3.2判断…

斌之曲科技集团迎接绵阳科技城新区领导考察,共探数字新能源

2024年3月22日上午&#xff0c;一场旨在促进科技与经济发展深度融合的考察活动在上海斌之曲科技集团总部隆重举行。绵阳科技城新区经济合作局局长陈桂全一行到访&#xff0c;集团董事长田斌先生、总裁廖彬曲女士热情接待&#xff0c;双方就科技创新、市场布局等议题进行了深入探…

js逆向入门之简概实例--MD5

目录 js逆向入门之简概&实例--MD5 爬虫: 爬虫流程&#xff1a; 逆向js原因: 网站反爬: 什么是MD5? js加密特征: 练习开始 正常请求 加post请求 伪装加U-Sign参数 伪装加Content-Type参数 请求参数变字符串 代码实现: 真逆开始 补充知识点: 代码 免责声明…

【数据结构刷题专题】—— 二叉树

二叉树 二叉树刷题框架 二叉树的定义&#xff1a; struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(NULL), right(NULL); };1 二叉树的遍历方式 【1】前序遍历 class Solution { public:void traversal(TreeNode* node, vector&…

[C#]winformYOLO区域检测任意形状区域绘制射线算法实现

【简单介绍】 Winform OpenCVSharp YOLO区域检测与任意形状区域射线绘制算法实现 在现代安全监控系统中&#xff0c;区域检测是一项至关重要的功能。通过使用Winform结合OpenCVSharp库&#xff0c;并结合YOLO&#xff08;You Only Look Once&#xff09;算法&#xff0c;我们…

Maven高级(工程分模块开发,聚合于继承,版本锁定,Mavne私服的搭建和发布)【详解】

目录 一、Maven复习 1. Maven基本概念 1 Maven的作用 2 Maven的仓库 3 坐标的概念 2. Maven安装配置 3. Maven构建项目 4. Maven依赖管理 5. Maven依赖传递 二、工程分模块开发 1. 分模块开发介绍 2. 工程分模块示例 (1) 创建父工程 (2) 创建pojo模块步骤 (3) 创…

YOLOv8改进 | 检测头篇 | 2024最新HyCTAS模型提出SAttention(自研轻量化检测头 -> 适用分割、Pose、目标检测)

一、本文介绍 本文给大家带来的改进机制是由全新SOTA分割模型(Real-Time Image Segmentation via Hybrid Convolutional-TransformerArchitecture Search)HyCTAS提出的一种SelfAttention注意力机制,论文中叫该机制应用于检测头当中(论文中的分割效果展现目前是最好的)。我…

如何学习VBA_3.2.19:利用Shell函数运行可执行程序

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。 如果…

Java-Java基础学习(4)-多线程(2)

3.7. Lambda表达式 为什么要使用lambda表达式 避免匿名内部类定义过多&#xff1b;可以让代码看起来更简洁&#xff1b;去掉一堆没有意义的代码&#xff0c;只留下核心逻辑 属于函数式编程的概念&#xff0c;格式 (params) -> expression [表达式](params) -> statement…

【教学类-44-11】20240324 杨任东竹石体 Regular(实线字体)制作的数字描字帖(AI对话大师缩略版)

作品展示 背景需求&#xff1a; 之前有三款阿拉伯数字字体&#xff0c;但是与《幼儿用数字描字簿》字体有差异 【教学类-44-05】20240201 德彪钢笔行书&#xff08;实线字体&#xff09;制作的数字描字帖-CSDN博客文章浏览阅读396次&#xff0c;点赞6次&#xff0c;收藏5次。【…

Python之Web开发中级教程----中级教程成果下载

Python之Web开发中级教程----中级教程成果下载 到目前为止&#xff0c;中级教程已经完成。 按照一步步的教程搭建虚拟机中的环境&#xff0c;包括内容如下&#xff1a; Ubuntu操作系统搭建 Python 配置 Redis 安装配置 Python库中包括 Pip安装 Pyinstaller安装 Redis安装 Jie…

strlen和sizeof

定义 strlen 和 sizeof 是 C 语言中两个用于确定字符串或数据类型大小的常用操作符&#xff0c;但它们的工作方式和目的有所不同。下面是对这两个操作符的详细解释&#xff1a; strlen strlen 是一个库函数&#xff0c;定义在 <string.h> 头文件中。它用于计算以空字符…

拥有超小型领先工艺射频微波电子元器件厂商兆讯授权世强硬创代理

射频前端芯片在模拟芯片中&#xff0c;属于进入门槛较高、设计难度较大的细分领域&#xff0c;由于国内射频前端芯片行业起步较晚&#xff0c;其市场份额主要被外企所占据&#xff0c;而在国产化浪潮的推动下&#xff0c;上游厂商的射频前端产品及技术逐渐具备领先的竞争优势。…

深度学习(三)vscode加jupyter notebook插件使用

0.前言 哎呀&#xff0c;我本次的实验是在新电脑上使用的&#xff0c;之前的笔记本上的环境什么的我都是很久以前弄好了的&#xff0c;结果到了新电脑上我直接忘了是该怎么配的了&#xff0c;不过万幸&#xff0c;花了点时间&#xff0c;查查补补&#xff0c;现在总算是可以了。…

论文汇总:A Closer Look at Few-shot Classification Again

文章汇总 文章是在总体上再一次地观察如何小样本领域存在的问题&#xff0c;并且发现了较为有趣的规律 1.测试误差随训练类别的数量而下降&#xff0c;而不是随每个类别的训练样本数量而下降。 2.训练算法(me&#xff1a;预训练模型)和自适应算法(me&#xff1a;预训练之后的…

参展企业和专业观众均创历届新高“2024杭州国际安防展会”

随着社会的不断发展&#xff0c;安防行业逐渐成为一个备受关注的领域。杭州作为中国的科技创新之城&#xff0c;一直以来都是安防行业的重要聚集地。本次展会的举办&#xff0c;不仅为参展企业提供了一个展示自身实力的平台&#xff0c;也为观众提供了一个了解安防行业最新技术…

深度解析JVM世界:JVM内存分配

本篇文章的主要内容是介绍JVM内存的分配方式、JVM内存的快速分配策略、JVM的逃逸分析和堆内存的分代思想几部分内容。 请同学们认真听讲&#xff0c;面试会问到。。。 1. 内存分配 大家需要注意不分配内存的对象无法进行其他操作 JVM 为对象分配内存的过程&#xff1a;首先…

[flask]http请求//获取请求体数据

import jsonfrom flask import Flask, requestapp Flask(__name__)app.route("/form1", methods["post"]) def form1():"""获取客户端请求的请求体[表单]:return:""""""获取表单数据请求url&#xff1a;&qu…
最新文章