C++ Vector详解

文章目录

  • 前言
  • 一、vector的定义
  • 二、vector中元素的访问
  • 三、vector中空间增长
  • 三、vector中增删查改
  • 总结


前言

在本篇文章中,我们将会学到关于C++中vector的使用方法
其中包括成员函数(构造,析构),迭代器相关的知识,容量(size,resize,capacity,reverse),以及vector的增删查改

一、vector的定义

单独定义一个vector:

vector < typename > name;

上面这个定义其实相当于是一维数组name[size],只不过其size可以根据需要进行变化,这就是“变长数组”的名字的由来。

这里的typename可以是任何基本类型,例如int、double、char、结构体等,也可以是STL标准容器,例如set、queue、vector等。

下面我们以int为例子:
🌟🌟v1一个空的vector

vector < int > v1

🌟🌟v2这个vector中包含10个int,并且默认初始化为0

vector < int > v2(10);

🌟🌟v3这个vector中包含10个int,并且手动初始化为1

vector < int > v3(10,1);

🌟🌟v4这个vector中采用v2迭代器区间进行开空间和初始化
并且空间大小和初始化内容与v2相同,即v4包含10个int,初始化为0

vector < int > v4(v2.begin(),v2,end())

🌟🌟v5这个vector中采用拷贝构造初始化,并且空间大小和初始化内容与v3相同,即v5包含10个int,初始化为1

vector < int > v5(v3)

🌟🌟v6这个vector中采用了初始化列表初始化,{}中有几个元素就代表开了几个空间,{}中内容表示初始化的值。这是c++11中的语法

vector < int >v6{1,2,3,4};

在这里插入图片描述

二、vector中元素的访问

vector库中提供了两种访问访问方式
✨ ✨operator [ ] 像数组一样进行访问
✨ ✨使用at进行访问,at访问不到元素是抛异常

vector v1{ 1,2,3,4 };
cout << v1[0] << endl;
cout << v1.at(1) << endl;

✨ ✨vecctor::begin() 指向第一个元素
✨ ✨vecctor::end() 指向第最后一个元素的下一个位置
✨ ✨vecctor::rbegin() 反向迭代器,指向元素最后一个元素
✨ ✨vecctor::rend() 反向迭代器,指向元素第一个位置
✨ ✨vector::front() 返回首元素的引用
✨ ✨vector::back() 返回最后一个元素的引用

vector中元素的遍历
😼😼.正常for循环

vector <int> v1{1,2,3,4};
//1.循环遍历
for (int i = 0; i < v1.size(); i++)
{
	cout << v1[i] << " ";
}
cout << endl;

😼😼.范围for


	//2.范围for
	vector <int> v1{1,2,3,4};
	///依次取v1中的值赋值给e,自动判断结束,自动++往后走
	for (auto& e : v1)
	{
		cout <<e << " ";
		
	}	cout << endl;

😼😼.迭代器,也可以使用反向迭代器

     //3.迭代器
     vector <int>::iterator it = v1.begin();
while(it!=v1.end())
{
	(*it) += 2;
	cout << *it << " ";
	it++;
}
cout << endl;

vector < int >::iterator it1=v1.begin();//正向迭代器
vector < int >::reverse_iterator it2=v2.rbegin();//反向迭代器
vector < int >::const_iterator it3=v3.begin();//const正向迭代器
vector < int >::const_reverse_iterator it3=v3.begin();//const反向迭代器
这些我们也可以用auto来代替,自动推倒类型

这三种方式不仅能访问vector的每一个元素,并且还可以对元素进行修改

三、vector中空间增长

在vector中有空间的大小,容量等概念,我们来一一学习一下

🔱🔱size 用于计算vector中数据个数

	vector<int> v(10);
	cout << v.size() << endl;

最终结果输出10

🔱🔱resize 改变size的大小,开空间同时进行初始化

  vector<int> v;
  for (int i = 1; i < 10; i++)
	  v.push_back(i);

  v.resize(5);
  //剩下的初始化为100
  v.resize(8, 100);
  //剩下的初始化为0
  v.resize(12);

  cout << "v contains:";
  for (size_t i = 0; i < v.size(); i++)
	  cout << ' ' << v[i];

最终输出结果为v contains: 1 2 3 4 5 100 100 100 0 0 0 0
resize变小时不会改变capacity的大小,resize变大时,capacity也会跟着相应的调整

🔱🔱capacity 获取容量大小
我们来看一下扩容机制

void TestVectorExpand()
{
	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';
		}
	}
}

vs2022输出结果为
在这里插入图片描述
g++下输出结果
在这里插入图片描述

我们发现不同平台扩容机制不同,vs按照1.5倍增长,g++按照两倍增长,我们不要固化的认为vector增容就是两倍,具体增长是根据具体需求决定的,vs是PJ版本STL,g++是SGI版本STL。

🔱🔱resreve 只负责开空间,不负责初始化工作
一般用于知道需要多少空间,用reverse一次性开好,这样就可以缓解vector增容的代价缺陷

 void TestVectorExpandOP()
{
   vector<int> v;
   size_t sz = v.capacity();
   v.reserve(100); // 提前将容量设置好,可以避免一遍插入一遍扩容
   cout << "making bar 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';
      }
   }
}

一次性开好需要的空间大小,就可以避免边插入边扩容的问题了
🔱🔱empty 判断vector中是否为空
🔱🔱shrink_to_fit 在size发生巨大变化时,采用shrink_to_fit 调整capacity的大小,使capacity可以与size的大小进匹配
在这里插入图片描述

三、vector中增删查改

🎁🎁push_back 尾插 pop_back尾删

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

	auto it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	v.pop_back();
	v.pop_back();

	it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

输出结果为在这里插入图片描述

🎁🎁find 查找这个并不是在vector库里的,而是算法模块实现的
在这里插入图片描述

🎁🎁insert 进行插入
    ❤️❤️在pos插入value

iterator insert (pos,val);

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	auto pos = find(v.begin(), v.end(), 3);
	//插入一个数
	if (pos != v.end())
	{
		v.insert(pos, 10);
	}
	pos = find(v.begin(), v.end(), 2);

    ❤️❤️在pos位置插入n个相同的值value

void insert ( pos, n, val);


	//插入多个值
	if (pos != v.end())
	{
		v.insert(pos, 2,100);
	}

    ❤️❤️在pos位置插入一段迭代器区间

void insert (pos, first, last);

    //插入一个迭代器区间
   vector<int>vv{ 20,30,40 };
   pos = find(v.begin(), v.end(), 1);
   if (pos != v.end())
   {
	   v.insert(pos, vv.begin(), vv.end());
   }

🎁🎁erase 删除值
    ❤️❤️删除pos位置的值

erase (pos);

   pos = find(v.begin(), v.end(), 30);
   v.erase(pos);

    ❤️❤️删除一段迭代器区间

erase (first,last);

     v.erase(v.begin(), v.begin() + 3);

🎁🎁swap 交换两个vector

void swap (vector& x);

    void test6()
  {
    	vector<int>v1{ 1,2,3,4 };
	    vector<int>v2{ 10,20,30,40 };
	    v1.swap(v2);
  }

在这里插入图片描述

🎁🎁clear 将size设置为零,capacity不变

cla

总结

以上就是今天要讲的内容,本文仅仅详细介绍了C++vector库的系列使用方法,希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘 😘

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

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

相关文章

[LeetCode][239]【学习日记】滑动窗口最大值——O(n)单调队列

题目 239. 滑动窗口最大值 难度&#xff1a;困难相关标签相关企业提示 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例 1…

C# Mel-Spectrogram 梅尔频谱

目录 介绍 Main features Philosophy of NWaves 效果 项目 代码 下载 C# Mel-Spectrogram 梅尔频谱 介绍 利用NWaves实现Mel-Spectrogram 梅尔频谱 NWaves github 地址&#xff1a;https://github.com/ar1st0crat/NWaves NWaves is a .NET DSP library with a lot …

SAP PP学习笔记 - 豆知识08 - 如何修改价格

正常的品目修改用MM02。 新建一个品目之后&#xff0c;啥都没干&#xff0c;现在想修改一下价格&#xff0c;发现MM02 修改不了了。 1&#xff0c;MR21 这里注意 转记日付 要和会计期间一致。 比如我这里的会计期间是 2024/03 有关会计期间&#xff0c;可以参照如下文章&am…

项目经理如何应对多系统对接的项目?

对于项目经理来说&#xff0c;处理系统对接&#xff08;API对接&#xff09;的需求是一项既复杂又关键的任务。这项任务涉及到确保不同的系统能够高效、安全地共享数据&#xff0c;从而实现流畅的业务流程和提高整体的系统性能。下面是一个详细的指南&#xff0c;旨在帮助产品经…

部署zabbix6.0.27 执行 make install 报错

CentOS7 部署 zabbix6.0.27 执行 make install 报错 报错信息 [rootlocalhost zabbix-6.0.27]# make install /usr/bin/ld: warning: libssl.so.3, needed by /usr/local/mysql/lib/libmysqlclient.so, not found (try using -rpath or -rpath-link) /usr/bin/ld: warning: l…

论文阅读:SDXL Improving Latent Diffusion Models for High-Resolution Image Synthesis

SDXL Improving Latent Diffusion Models for High-Resolution Image Synthesis 论文链接 代码链接 介绍 背景&#xff1a;Stable Diffusion在合成高分辨率图片方面表现出色&#xff0c;但是仍然需要提高本文提出了SD XL&#xff0c;使用了更大的UNet网络&#xff0c;以及增…

Java定时调度范式定时操作

在 Java 中&#xff0c;我们可以使用各种方法来执行定时操作。这些操作包括执行任务、调度任务、执行重复任务等。下面将介绍几种常见的 Java 定时调度范式。 1. Timer 和 TimerTask Java 提供了 Timer 和 TimerTask 类&#xff0c;用于执行定时任务。 示例代码&#xff1a;…

【JavaEE初阶】 JVM简介

文章目录 &#x1f38d;前言&#x1f343;JVM发展史&#x1f6a9;Sun Classic VM&#x1f6a9;Exact VM&#x1f6a9;HotSpot VM&#x1f6a9;JRockit&#x1f6a9;J9 JVM&#x1f6a9;Taobao JVM&#xff08;国产研发&#xff09; &#x1f340;JVM 运行流程⭕总结 &#x1f3…

【Datawhale组队学习:Sora原理与技术实战】

Transformersdiffusion技术背景简介 Transformers diffusion背景 近期大火的OpenAI推出的Sora模型&#xff0c;其核心技术点之一&#xff0c;是将视觉数据转化为Patch的统一表示形式&#xff0c;并通过Transformers技术和扩散模型结合&#xff0c;展现了卓越的scale特性。 被…

成功实施自动化测试的优点

随着技术的发展&#xff0c;保证应用程序的质量变得越来越具有挑战性。由于敏捷开发和成本因素&#xff0c;导致了发现问题窗口时间有限&#xff0c;因此测试经常会忽略某些应该关注的地方。 测试工程师应该在发布产品之前发现其中存在的问题&#xff0c;但是任何软件都不可能…

SpringBoot项目如何添加全局接口上下文

1. 定义Spring Boot应用的路由 首先&#xff0c;确保您的Spring Boot应用有一个统一的路由前缀。例如&#xff0c;可以在application.properties或application.yml配置文件中使用server.servlet.context-path属性来定义所有请求的基础路径。 # application.properties server…

Ansible 基础入门

2&#xff09;Ansible 介绍 Ansible 基本概念 Ansible 是一种自动化运维工具&#xff0c;基于 Paramiko 开发的&#xff0c;并且基于模块化工作&#xff0c;Ansible 是一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台&#xff0c;它是基于 Python 语言&#xf…

sudo command not found

文章目录 一句话Intro其他操作 一句话 sudo 某命令 改成 sudo -i 某命令 试试。 -i 会把当前用户的环境变量带过去&#xff0c;这样在sudo的时候&#xff0c;有更高的权限&#xff0c;有本用户的环境变量(下的程序命令)。 -i, --login run login shell as the target user; a …

I’m stuck!(CCF201312-5)解析(java实现)

代码 package test_201312;import java.util.Scanner;/** 201312-5 试题名称&#xff1a; I’m stuck! 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述给定一个R行C列的地图&#xff0c;地图的每一个方格可能是#, , -, |, ., S, T七…

JS使用方式

JS是解释性语言&#xff0c;所以不需要搭建类似C#/Java之类的开发运行环境&#xff0c;因为他们是编译型语言。JS一般运行在浏览器中或者node环境中&#xff0c;这里都是JS引擎的功劳。 node环境使用 推荐使用nvm管理node版本&#xff0c;nrm管理代理地址。 安装node&#xf…

腾讯云服务器和阿里云服务器哪家更优惠?2024价格对比

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器61元一年&#xff0c;2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…

【蓝桥杯基础算法】dfs(上)组合数,全排列

刚接触算法&#xff0c;有没有被递归又循环的dfs吓到&#xff1f;没关系&#xff0c;几个例题就可以彻底掌握&#xff01; 1.全排列 1-n的全排列,如输入3&#xff0c;按顺序对1-3进行排列 //枚举 #include<iostream> #include<algorithm> #include<cstring>…

【Linux基础(二)】进程管理

学习分享 1、程序和进程1.1、程序1.2、进程和进程ID 2、Linux下的进程结构3、init进程4、获取进程标识5、fork系统调用5.1、fork函数实例分析 6、进程的特性7、在Linux下进程指令7.1、终止进程指令7.2、查看进程指令&#xff1a;7.3、以树状图列出进程 8、多进程运行异常情况8.…

【Spring云原生系列】Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合!

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

2024年抖店新商家自学全套教程,完整版店铺操作流程,如下!

我是王路飞。 想做一个项目的话&#xff0c;就要先了解其完整的流程是怎样的。 做抖店也不例外&#xff0c;没开店的就先了解下抖店的基本信息和大概运营流程&#xff1b;开过店的就先让自己入门并把流程跑通&#xff0c;如此才有承接后续渠道和资源的能力。 今天这篇文章专…