【c++】vector用法详解

vector用法详解

  • vector定义
  • vector容器的构造函数
  • vector容器内元素的访问
    • 1.通过下标 + [ ]来访问
    • 2.通过迭代器来访问
    • 3.通过范围for来访问
  • vector常用函数的用法解析
    • 1.size()
    • 2.clear()
    • 3.capacity()
    • 4.reserve()
    • 5.resize()
    • 6.shrink_to_fit()
    • 7.pop_back()
    • 8.push_back()
    • 9.erase()
    • 10.insert()
      • 补充:算法库中的find()
    • 11.vector iterator适用
      • 1. begin() + end()
      • 2.rbegin() + rend()

铁汁们,今天给大家分享一篇vector用法详解,来吧,开造⛳️

vector定义

💡 vector< typename> name ;

  • vector本质是顺序表,是可以更改大小的"变长数组"。

  • typename为任意类型,例如:int、char、double、string、vector。

💡 Tips:vector是可变大小数组的序列容器。vector使用动态分配数组来存储它的元素,物理空间连续,可以采用下标+[ ]对vector中的元素进行访问。在末尾插入或者删除一个元素时间复杂度为O(1),效率高,而在其他位置处进行插入或者删除一个元素时间复杂度为O(n),效率低,而对于其他物理空间不连续的容器采用迭代器或者引用的方式来访问元素效率高。

vector容器的构造函数

  • 1.构造一个没有元素的空数组a, 元素类型为typename。

💡1. vector a ;

  • 2.构造一个与容器c内元素相同的数组d, 元素类型为typename。

💡2.vector d(const vector& c) ;

  • 3.构造一个与[first, last)范围一样多元素的容器c。

💡3.vector c(iterator first, iterator last ) ;

  • 4.构造一个包含n个元素,每个元素的值为val的数组b, 元素类型为typename。

💡4.vector b(size_t n, const typename& val ) ;

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<string>

using namespace std;

int main()
{
	vector<int> a;
	for (auto it : a)
	{
	    cout << it << ' ';
	}
	    
	vector<int> b(5, 1);
	for (auto it : b)
	{
	    cout << it << ' ';
	}
	cout << endl;
	    
	string s("abcd");
	vector<int> c(s.begin(), s.end());
	//编码表-字符与ASCII值对应的表,内存中实际存储的是字符所对应的ASCII值
	for (auto it : c)
	{
	    cout << it << ' ';
	}
	cout << endl;
	    
	vector<int> d(b);
	for (auto it : d)
	{
	    cout << it << ' ';
	}
	
	return 0;
}

在这里插入图片描述

vector容器内元素的访问

1.通过下标 + [ ]来访问

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

2.通过迭代器来访问

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

3.通过范围for来访问

for (auto it : v) //只要该容器支持迭代器,就支持范围for,原因:范围for的底层实现为迭代器
{
	cout << it << ' ';
}
cout << endl;

💡 Tips:只要某个容器支持迭代器,就支持范围for, 原因:范围for的底层实现为迭代器。

vector常用函数的用法解析

1.size()

💡 1.size_t size( )const ;

  • 功能:获得vector中元素的总个数,元素类型为typename。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<string> v1(5, "1111"); //
	cout << v1.size() << endl;
	
	vector<int> v2;
	v2.push_back(1);
	v2.push_back(2);
	v2.push_back(3);
	vector<int> v3(v2.begin() + 1, v2.end());
	cout << v2.size() << endl << v3.size() << endl;
	
	return 0;
}

在这里插入图片描述

2.clear()

💡2.void clear( ) ;

  • 功能:使vector中元素的总个数size变为0,但容量capacity不变。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v(4, 2);
	cout << v.size() << ' ' << v.capacity() << endl;
	v.clear();
	cout << v.size() << ' ' << v.capacity() << endl;
		
	return 0;
}

在这里插入图片描述

3.capacity()

💡3.size_t capacity( )const ;

  • 功能:获得当前分配给vector存储空间的大小。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v; //测试vs下vector默认的扩容机制 -》1.5倍
	size_t sz = v.capacity();
	cout << "start capacity:" << sz << endl;
	for (size_t i = 0; i < 100; i++)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "changed capacity:" << sz << endl;
		}
	}
	
	return 0;
}

在这里插入图片描述

💡 Tips:在vs下capacity呈1.5倍增长的,vs是PJ版本的STL、在g++(linux)下capacity呈2倍增长的,g++是 SGI版本的STL。vector的增容,具体增多少,不能固化,在不同编译器下增容的定义是不同的。

4.reserve()

4.void reserve(size_t n) ;

  • 功能:使得vector容器存储空间的大小为n。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v;
	for (size_t i = 1; i < 15; i++)
		v.push_back(i);
	cout << v.size() << ' ' << v.capacity() << endl;
	
	v.reserve(16); //情况一: size < n < capacity ->size不变,capacity不变
	cout << v.size() << ' ' << v.capacity() << endl;
	
	v.reserve(22); //情况二: n > capacity  ->size不变,capacity改变,扩容
	cout << v.size() << ' ' << v.capacity() << endl;
	for (auto it : v)
	{
		cout << it << ' ';
	}
	cout << endl;
	
	v.reserve(5); //情况三: size > n ->size改变,size不变,capacity不变
	cout << v.size() << ' ' << v.capacity() << endl;
		
	return 0;
}
  • 相当于扩容,不会初始化。

  • 不会改变数据,只会改变容量。当n < size 或 size < n < capacity,在vs下不会缩容,在g++下会缩容。

  • reserve(n),是否会开辟n个空间,取决于编译器,仅仅是向编译器做了个请求工作。

  • 已知需开辟空间的大小为n,可以使用reserve(n),从而减少扩容的次数,提高效率,因为扩容有损耗。

在这里插入图片描述

5.resize()

💡5.void resize(size_t n, const typename& val = typename( ) ) ;

  • 功能:调整vector容器的大小,使其内元素个数变为n。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v;
	for (size_t i = 1; i < 15; i++)
		v.push_back(i);
	cout << v.size() << ' ' << v.capacity() << endl;
	
	v.resize(16); //情况一: size < n < capacity ->size改变,capacity不变,插入数据
	cout << v.size() << ' ' << v.capacity() << endl;
	
	v.resize(22); //情况二: n > capacity  ->size改变,capacity改变,扩容+插入数据
	cout << v.size() << ' ' << v.capacity() << endl;
	for (auto it : v)
	{
		cout << it << ' ';
	}
	cout << endl;
		
		return 0;
	}
	
	v.resize(5); //情况三: size > n ->size改变,capacity不变,删除数据
	cout << v.size() << ' ' << v.capacity() << endl;
		
	return 0;
}

在这里插入图片描述

  • 相当于扩容 + 初始化。
  • 既改变容量,又改变数据。当n < size 或 size < n < capacity,在vs下不会缩容,在g++下会缩容。
  • 情况一: size > n ->size改变,capacity不变,删除数据 ;情况二: size < n < capacity
    ->size改变,capacity不变,插入数据 ; 情况三: n > capacity ->size改变,capacity改变,扩容+插入数据 。
  • 初始化处默认给缺省值,缺省值为无参构造函数,自定义类型会去调它自己的默认构造函数,c++11为了兼容模板,使得内置类型也有构造函数,内置类型得无参构造函数初始化为0eg:int
    val = int(), val = 0、double val = double(),val = 0.0,int* val =
    int*() , val = nullptr、char val = char(), val = ‘\0’。

6.shrink_to_fit()

💡void shrink_to_fit( ) ;

  • 功能:缩容,使capacity()减小到与size()大小相同。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v;
	for (size_t i = 1; i < 15; i++)
		v.push_back(i);
	cout << v.size() << ' ' << v.capacity() << endl;
	
	v.resize(5);
	cout << v.size() << ' ' << v.capacity() << endl;
	
	v.shrink_to_fit();
	cout << v.size() << ' ' << v.capacity() << endl;
		
	return 0;
}

在这里插入图片描述

7.pop_back()

💡void pop_back( ) ;

  • 功能:删除最后一个元素。
  • 8.push_back()

💡void push_back( ) ;

  • 功能:在末尾插入一个元素。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

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

	for (auto it : v)
	{
		cout << it << ' ';
	}
	cout << endl;

	v.pop_back();

	for (auto it : v)
	{
		cout << it << ' ';
	}
	cout << endl;
			
	return 0;
}

在这里插入图片描述

9.erase()

💡void erase(iterator position) ;

  • 功能:删除指定位置(迭代器)处的值。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.erase(v.begin() + 1);
	for (auto it : v)
	{
		cout << it << ' ';
	}
	cout << endl;
		
	return 0;
}

在这里插入图片描述

10.insert()

💡void insert(iterator position , const typename& x) ;

  • 功能:在指定的位置(迭代器)前插入元素x。

💡void insert(iterator position , iterator first , iterator end) ;

  • 功能: 在指定位置(迭代器)前插入与范围[first , end)一样多元素的容器

补充:算法库中的find()

💡iterator find(iterator first, iterator end, const typename& x) ;

  • 功能:在范围[first, end)容器中查找与x相同的元素,若查找到了,则返回查找到的元素所在的位置(迭代器),否则返回end(迭代器)。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
	vector<int> v1(5, 2);
	vector<int> v2(3, 6);
	v1.insert(v1.begin() + 2, 3);
	v1.insert(v1.begin(), v2.begin(), v2.end());
	
	for (auto it : v1)
	{
		cout << it << ' ';
	}
	cout << endl;
	
	vector<int>::iterator p = find(v1.begin() + 1, v1.end(), 3);
	if (p != v1.end())
		cout << "查找到了" << endl;
	else
		cout << "查找不到" << endl;
				
	return 0;
}

在这里插入图片描述

  • 头文件为#include。
  • 是函数模板,泛型编程,不是针对于某个容器的迭代器实现的,而是针对于所有容器的迭代器实现的。

11.vector iterator适用

1. begin() + end()

💡iterator begin( )、const_iterator begin( )const

  • 功能:返回第一个元素的位置(迭代器)。

Tips:const_iterator 修饰的是迭代器所指向的元素不能被修改,而迭代器本身可以被修改。const修饰this指针,表示在该成员函数中成员变量不允许被修改,此处const的用法只能用于类中的成员函数。

💡iterator end( )、const_iterator end( )const ;

  • 功能:返回最后一个元素的下一个位置(迭代器)。

2.rbegin() + rend()

💡iterator rbegin( )、const_iterator rbegin( )const ;

  • 功能:返回最后一个元素的位置(迭代器)。

💡iterator rend( )、const_iterator rend( )const ;

  • 功能:返回第一个元素的前一个位置(迭代器)。
    在这里插入图片描述

铁铁们,vector用法详解就到此结束啦,若博主有不好的地方,请指正,欢迎铁铁们留言,请动动你们的手给作者点个👍鼓励吧,你们的鼓励就是我的动力✨

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

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

相关文章

父类之王“Object”类和内部类

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;&#x1f468;&#x1f3fb;‍&#x1f393;告别&#xff0c;今天 &#x1f4d4;高质量专栏 &#xff1a;☕java趣味之旅 欢迎&#x1f64f;点赞&#x1f5e3;️评论&#x1f4e5;收藏&#x1f493;关注 &#x1f496;衷心的希…

ES6-let

一、基本语法 ES6 中的 let 关键字用于声明变量&#xff0c;并且具有块级作用域。 - 语法&#xff1a;let 标识符;let 标识符初始值; - 规则&#xff1a;1.不能重复声明let不允许在相同作用域内重复声明同一个变量2.不存在变量提升在同一作用域内&#xff0c;必须先声明才能试…

企查查headers动态加密参数(附代码)

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…

c语言:贪吃蛇的实现

目录 贪吃蛇实现的技术前提&#xff1a; Win32 API介绍 控制台程序&#xff08;console&#xff09; 控制台屏幕上的坐标 GetStdHandle GetConsoleCursorInfo CONSOLE_CURSOR_INFO SetConsoleCursorInfo SetConsoleCursorPosition GetAsyncKeyState 宽字符的打印 …

企业在什么情况下需要一款固定资产管理系统?

在现代商业环境中&#xff0c;企业的固定资产是其运营和发展的重要基础。然而&#xff0c;许多企业在固定资产管理方面面临着挑战&#xff0c;如信息不准确、效率低下和资源浪费等问题。为了解决这些问题&#xff0c;越来越多的企业开始意识到引入一款固定资产管理系统的重要性…

BLIP-2:低计算视觉-语言预训练大模型

BLIP-2 BLIP 对比 BLIP-2BLIPBLIP-2如何在视觉和语言模型之间实现有效的信息交互&#xff0c;同时降低预训练的计算成本&#xff1f;视觉语言表示学习视觉到语言的生成学习模型架构设计 总结主要问题: 如何在计算效率和资源有限的情况下&#xff0c;有效地结合冻结的图像编码器…

【NTN 卫星通信】基于NTN的多3GPP连接应用场景

1 概述 同时聚合两条3GPP接入链路&#xff0c;其中一条为非地面网络&#xff0c;可以提供以下5G业务使能&#xff0c;尤其适用于带宽有限或接入链路不可靠的服务不足地区:   -扩展流动宽频   -超可靠的服务通信 如技术报告38.821所述&#xff0c;若干服务场景(例如在偏远地…

时间序列预测 —— ConvLSTM 模型

时间序列预测 —— ConvLSTM 模型 时间序列预测是一项重要的任务&#xff0c;ConvLSTM&#xff08;卷积长短时记忆网络&#xff09;是深度学习领域中用于处理时序数据的强大工具之一。本文将介绍 ConvLSTM 的理论基础、优缺点&#xff0c;与其他常见时序模型&#xff08;如 LS…

golang开发window环境搭建

1.本人开发环境&#xff1a;window10,idea2020.1.3 2.Go语言环境版本1.5.1 2.1. go语言插件 下载地址 csdn - 安全中心 2.2下载安装 3.idea配置go环境 4.创建go项目 、5.运行

ShardingSphere 5.x 系列【4】产品介绍

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 简介2. 核心特性2.1 数据分片2…

空中加油3D可视化:引领航空领域的新革命

随着科技的日新月异&#xff0c;我们生活的方方面面都在发生着深刻的变化。而在航空领域&#xff0c;3D可视化技术正在引领新的革命。它不仅为飞行员提供了一种全新的视角&#xff0c;更在保障飞行安全、提高飞行效率方面发挥着不可替代的作用。 在传统的空中加油中&#xff0c…

无人机遥感技术在地质灾害监测应用分析,多旋翼无人机应急救援技术探讨

地质灾害是指在地球的发展演变过程中&#xff0c; 由各种自然地质作用和人类活动所形成的灾害性地质事件。给人民的生命和财产安全带来严重威胁&#xff0c;因此有必要开展地质灾害预测预报、灾害应急和风险区划 遥感技术的快速发展为我们提供了一种获取实时灾害信息的可靠手段…

Echarts+Vue 首页大屏静态示例Demo 第三版

效果图: 源码: <template><div class="content bg" style="height: 100vh;overflow-y: auto" :class="{ fullscreen-container: isFullScreen }"><div class="reaDiv" style="height: 10vh"><div…

FPGA项目(16)——基于FPGA的音乐演奏电路

1.设计要求 能在实验箱上&#xff0c;循环播放一段音乐。&#xff08;需要源码的直接看最后一节&#xff09; 2.设计原理 组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需要的两个基本要素&#xff0c;问题是如何来获取这两个要素所对应的数值以及通过纯硬件…

幻兽帕鲁内存溢出怎么办,一键设置定时重启,修改虚拟内存,定时清理,轻松解决卡顿!再也不怕爆内存了!

幻兽帕鲁的内存溢出问题&#xff0c;玩久了确实会变卡。这里给出三个解决思路&#xff1a; 第一种方法是定时进行内存清理&#xff08;装个软件就可以&#xff09;&#xff0c;网上也有很多教程&#xff0c;我会把下载地址放在文章后面&#xff0c;大家可以去下载。第二种方法…

c语言二叉树的创建,三种遍历方式,销毁

二叉树的创建 typedef char datatype; typedef struct Node {datatype data;struct Node *left_child;struct Node *right_child;}*Btree; //二叉树的创建 Btree create_node() {Btree t(Btree)malloc(sizeof(struct Node));if(NULLt)return NULL;t->data0;t->left_chil…

Unity项目从built-in升级到URP(包含早期版本和2023版本)

unity不同版本的升级URP的方式不一样&#xff0c;但是大体流程是相似的 首先是加载URP包 Windows -> package manager,在unity registry中找到Universal RP 2023版本&#xff1a; 更早的版本&#xff1a; 创建URP资源和渲染器​​ 有些版本在加载时会自动创建&#…

【PyTorch][chapter 14][李宏毅深度学习][Word Embedding]

前言&#xff1a; 这是用于自然语言处理中数据降维的一种方案。 我们希望用一个向量来表示每一个单词. 有不同的方案 目录&#xff1a; one-hot Encoding word-class 词的上下文表示 count-based perdition-based CBOW Skip-Gram word Embedding 词向量相似…

全流程机器视觉工程开发(三)任务前瞻 - 从opencv的安装编译说起,到图像增强和分割

前言 最近开始做这个裂缝识别的任务了&#xff0c;大大小小的问题我已经摸得差不多了&#xff0c;然后关于识别任务和分割任务我现在也弄的差不多了。 现在开始做正式的业务&#xff0c;也就是我们说的裂缝识别的任务。作为前言&#xff0c;先来说说场景&#xff1a; 现在相…

微服务的幂等性

微服务架构设计的中心思想是将服务进行拆分&#xff0c;但是在这个过程中&#xff0c;如果被依赖的服务发生奔溃&#xff0c;就会引起一系列问题。为了解决这个问题&#xff0c;就会引入重试的机制&#xff0c;重试又会引入幂等性的问题&#xff0c;下面我们就分析这个过程&…