C++《vector类的使用介绍》

news2024/11/25 22:51:21

本文主要介绍vector一些常见的接口函数的使用

文章目录

  • 一、vector的介绍
  • 二、vector的使用
    • 2.1vector构造函数
    • 2.2迭代器的使用
    • 2.3空间增长问题
    • 2.4增删查改问题



一、vector的介绍

  1. vector是表示可变大小数组的序列容器。
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。
  3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。
  4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大
  5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
  6. 与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起lists和forward_lists统一的迭代器和引用更好。

二、vector的使用

2.1vector构造函数

构造函数功能
vector()无参构造
vector(size_type n, const value_type& val = value_type())构造并初始化n个val
vector (const vector& x)(重点)拷贝构造
vector (InputIterator fifirst, InputIterator last) 使用迭代器进行初始化构造
void test1()
{
	vector<int> v1;//无参的构造用的最多
	vector<int> v2(10,1);//用10个1来初始化
	vector<int> v3(v2.begin(),v2.end());//用一段迭代器区间去初始化
	vector<int> v4(v3);//拷贝构造

	string s("hello");
	vector<char> v5(s.begin(), s.end());//不同STL的迭代器区间也可以初始化
}

结果展示:
打开监视窗口观察,确实初始化好了
在这里插入图片描述
问题:
对于下面这种情况:

string s; 和 vector<char> v; 

是不是差不多呢?能不能相互替代呢?

不行的!因为string末尾带着\0,而且string提供了一些专门的字符串相关的接口函数,比如:operator+=c_strfind等等函数

2.2迭代器的使用

iterator的使用功能
begin+end获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator
rebegin+rend获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置reverse_iterator

在这里插入图片描述

//vector中如何遍历
void test2()
{
	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)
	{
		v[i] += 1;
		cout << v[i] << " ";
	}
	cout << endl;

	//迭代器
	//vector<int>::iterator it=v.begin();
	auto it=v.begin();//使用auto更方便
	while (it != v.end())
	{
		
		cout << *it << " ";
		++it;
	}
	cout << endl;
	
	//反向迭代器
   	//vector<int>::reverse_iterator rit = v.rbegin();
   	auto rit = v.rbegin();
	while (rit != v.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	//范围for
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

2.3空间增长问题

容量函数功能
size( )获取数据个数
capacity( )获取容量大小
empty( )判空
resize( )改变size
reserve( )改变capacity
void test3()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	cout << v.size() << endl;
	cout << v.capacity() << endl;
	cout << v.empty() << endl;
	cout << endl;

//改变capacity
	v.reserve(100);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
	cout << v.empty() << endl;
	cout << endl;
	
//改变size,默认给上缺省值0,它可以 扩容+初始化 或者 删除数据
	v.resize(10,1);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
	cout << v.empty() << endl;
	cout << endl;

//将有效字符缩减为2个(相当于删数据)
	v.resize(2);
	cout << v.size() << endl;
	cout << v.capacity() << endl;
	cout << v.empty() << endl;
	cout << endl;
}

结果展示:
在这里插入图片描述
总结:

  1. capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。这个问题经常会考察,不要固化的认为,顺序表增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。
  2. reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。
  3. resize在开空间的同时还会进行初始化,影响size。

我们可以测试一下不同版本扩容的情况:

//测试扩容
void test_VectorExpand()
{
	size_t sz;
	const size_t n = 100;
	vector<int> v1;

	sz = v1.capacity();
	for (size_t i = 0; i < n; ++i)
	{
		v1.push_back(i);
		if (sz != v1.capacity())
		{
			sz = v1.capacity();
			cout << "capacity chang" << sz << endl;
		}
	}
}

VS下结果:
在这里插入图片描述

g++下:
在这里插入图片描述

2.4增删查改问题

函数功能
push_back( )尾插
pop_back( )尾删
insert( )在pos之前插入
erase( )删除
swap( )交换两个vector的数据空间
operator[ ]下标位置访问
find( )这个是算法库里面实现的查找(algorithm),不是vector的成员函数
void test_vector5()
{
	vector<int> v;
//尾插数据
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

//指定pos位置插入
	//insert
	//vector<int>::iterator pos = find(v.begin(), v.end(), 2);
	auto pos = find(v.begin(), v.end(), 2);
	if (pos != v.end())
	{
		v.insert(pos, 100);
	}
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

//尾删数据
	//pop_back
	v.pop_back();
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

//find查找数据	
	pos = find(v.begin(), v.end(), 2);
	if (pos != v.end())
	{
		v.erase(pos);
	}
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

//erase支持迭代器删除数据(头删)
	v.erase(v.begin());
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

//erase删除区间
	v.erase(v.begin(), v.end());
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

vector::swap的使用
void swap (vector& x);

void test_vector6()
{
	vector<int> v1(10, 1);
	vector<int> v2(10, 2);

	v2.swap(v1);
}

说明:vector是支持迭代器的,还可以用范围for对vector进行遍历,支持迭代器就支持范围for,因为在编译时编译器会自动将范围for替换为迭代器遍历的形式。

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

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

相关文章

比赛记录:Codeforces Round 871 (Div. 4) A~H

传送门:CF A题:A. Love Story 简单比对一下即可解决 #include <bits/stdc.h> using namespace std; typedef long long ll; #define root 1,n,1 #define ls rt<<1 #define rs rt<<1|1 #define lson l,mid,rt<<1 #define rson mid1,r,rt<<1|1 …

模拟银行账户转账业务

文章目录 一、需求分析二、核心代码1. 业务层添加 Spring 事务管理2. 配置类中设置事务管理器3. 开启注解式事务驱动 三、相关截图 一、需求分析 需求&#xff1a; 实现任意两个账户间转账操作&#xff0c;要求当转账过程出现异常时&#xff0c;转账方与被转账方的转账操作同时…

操作系统笔记--CPU调度

1--基本概念 CPU调度&#xff1a; 从进程的就绪队列中挑选一个进程/线程作为CPU将要运行的下一个进程/线程&#xff1b; 在下图中&#xff0c;进程产生状态转换时&#xff08;运行→结束、运行→等待&#xff0c;等等&#xff09;都会发生相应的CPU调度&#xff1b; 内核运行调…

2023/5/7周报

目录 摘要 论文阅读 1、标题和现存问题 2、循环神经网络和传统 LSTM 3、堆叠 LSTM和论文模型结构 4、实验准备 5、结果分析 深度学习 1、TGCN 2、公式 3、伪代码 总结 摘要 本周在论文阅读上&#xff0c;阅读了一篇基于注意力机制的堆叠LSTM心电预测算法的论文。模…

1 Python数据分析概况

1 Python数据分析概况 1.1 认识数据分析1.2 熟悉Python数据分析的工具Python数据分析常用类库 1.3 Jupyter Notebook 快捷键 1.1 认识数据分析 数据分析是指用适当的分析方法对收集来的大量数据进行分析&#xff0c;提取有用信息和形成结论&#xff0c;对数据加以详细研究和概…

C语言刷题(1)----指针数组

下面指针选题来源于教材、牛客网。 1.键盘输入一个字符串&#xff0c;编写代码获取字符串的长度并输出&#xff0c;要求使用字符指针实现。 示例&#xff1a; 输入&#xff1a; helloworld 返回值&#xff1a; 10 代码实现 #include<stdio.h> int main (void) {char st…

117-Linux_数据库_事务

事务 一.什么是事务?二.事务的四大特性1.原子性(atomicity)2.一致性(consistency)3.隔离性(isolation)4.持久性(durability) 三.隔离级别1.READ UNCOMMITTED 未提交读2.READ COMMITTED 提交读3.REPEATABLE READ 可重复读4.SERIALIZABLE 可串行化5.查看隔离级别(1)查看当前会话…

HTML5 FormData 方法介绍

XMLHttpRequest 是一个浏览器接口&#xff0c;通过它&#xff0c;我们可以使得 Javascript 进行 HTTP (S) 通信。XMLHttpRequest 在现在浏览器中是一种常用的前后台交互数据的方式。2008年 2 月&#xff0c;XMLHttpRequest Level 2 草案提出来了&#xff0c;相对于上一代&#…

MySQL之约束讲解

1. 主键约束 主键约束要求列的数据唯一&#xff0c;并且不能为空。 主键能够唯一地标识表中的一条记录。 主键和记录之间的关系如同身份证和人之间的关系&#xff0c;它们之间是一一对应的。 1.1 单字段主键 直接在定义列的时候指定主键即可。 create table temp1( num int …

高通 Android 13 兼容extfat模式

Android本身不支持extfat格式 需要通过nofuse 打kernel补丁方式去实现 1、kernel/msm-4.19/arch/arm64/configs/vendor/device-perf_defconfig 增加 diff --git a/kernel/msm-4.19/arch/arm64/configs/vendor/device-perf_defconfig b/kernel/msm-4.19/arch/arm64/configs/ve…

导航栏模糊背景 out 了? 来看看这种模糊是否合你胃口? 并且学习 backdrop-filter

导航栏模糊背景 out 了? 来看看这种模糊是否合你胃口? 并且学习 backdrop-filter 传统情况模糊导航栏效果 &#x1f19a; 一种比较新的模糊导航栏效果(比如 Element-Plus 官网的导航栏效果, 有些类似密集点阵式) 导航栏要实现这个效果必须设置背景为有透明的颜色并且通过 ba…

Docker安装常用软件-Apollo

零&#xff1a;apollo概念介绍 官网网站&#xff1a;GitHub - apolloconfig/apollo: Apollo is a reliable configuration management system suitable for microservice configuration management scenarios. gitee网址&#xff1a;mirrors / ctripcorp / apollo GitCode …

家用电器-电磁炉加热原理及实现

目录 一、历史 二、基本原理 三、电路组成 3.1 控制电路 3.2 电源电路 3.3 电磁线圈及驱动电路 3.4 传感器电路 3.5 散热-风扇 四、电磁炉的核心部件 五、电磁炉特点 5.1 加热速度快 5.2 热效率高 5.3 加热的均匀性 六、国内电磁炉市场 参考资料 一、历史 电磁炉…

【Python入门】Python的判断语句(if else 语句)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

idea调优|maven调优

一、idea调优 1、idea启动优化 首先打开idea->Help->Edit Custom VM Options 按如下配置调整既有参数&#xff0c;参数数值不固定&#xff0c;需根据开发环境配置适当调整。针对如下配置#号后面的为注释&#xff0c;配置时需删除 # 启动堆大小 -Xms2048m # 最大运行堆…

SpringCloud-OpenFeign案例实战

关于Spring Cloud Open Feign的介绍可以参考这两篇博客 OpenFeign服务接口调用 使用Feign作为服务消费者 本博客参考gitee开源项目代码&#xff0c;结合自己的理解&#xff0c;记录下微服务场景下的使用。Talk is cheap. Show me the code&#xff01; 一、项目结构 这里使用…

FJUT第17届校赛题解

致歉 由于出题人经验不足&#xff0c;给大家带来不好的体验&#xff0c;实在抱歉。在赛中忘记开答疑&#xff0c;发不了公告&#xff0c;发现的问题已经在尽量修补。出现的问题如下&#xff08;均修复&#xff09;&#xff1a; 1.薛薛的简单数学题&#xff0c;没写spj&#xf…

【Python从入门到进阶】18、文件内容序列化和反序列化操作

接上篇《17、文件的读写操作》 上一篇我们学习了Python文件对象包含哪些方法&#xff0c;并学习了文件如何进行读、写、定位和删除。本篇我们来学习文件读取及写入数据序列化和反序列化的操作。 一、什么是序列化和反序列化 通过文件操作&#xff0c;我们可以将字符串写入到一…

【Linux】 OpenSSH_7.4p1 升级到 OpenSSH_8.7p1(亲测无问题,建议收藏)

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录 文章声明前述安装一些必要的命令&…

MySQL数据库学习(进阶篇)

1.存储引擎 1.1 MySQL体系结构 连接层 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 第二层家口主要完成大多数的核心服务功能&#xff0c;如SQL接口…