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

news2024/11/26 16:42:16

目录

一,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;
}

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

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

相关文章

播放海康摄像头直播流使用笔记

1、将海康摄像头绑定到萤石云平台&#xff0c;并查看直播流 2、项目中使用 1、安装hls cnpm i hls.js 2、封装组件&#xff08;在components文件夹下新建bodyCapture文件夹下index.vue&#xff09; <template><el-dialogtitle"遗体抓拍"class"bo…

git 常用基本命令, reset 回退撤销commit,解决gitignore无效,忽略记录或未记录远程仓库的文件,删除远程仓库文件

git 基本命令 reset 撤销commit https://blog.csdn.net/a704397849/article/details/135220091 idea 中 rest 撤销commit过程如下&#xff1a; Git -> Rest Head… 在To Commit中的HEAD后面加上^&#xff0c;点击Reset即可撤回最近一次的尚未push的commit Reset Type 有三…

Unity 旋转跟随

Unity 使用任意一个局部轴指向目标 效果&#xff1a; 主要用于在编辑器中可视化对象的朝向&#xff0c;同时提供了选择不同轴向的功能。在运行时&#xff0c;物体将根据所选择的轴向朝向目标&#xff0c;并在 Scene 视图中绘制一个带箭头的圆环。 定义轴向枚举&#xff1a;…

学python用哪本书比较好,学python应该买什么书

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;学python用哪本书比较好&#xff0c;学python应该买什么书&#xff0c;今天让我们一起来看看吧&#xff01; 文章目录 一、Python 基础 01-《Python编程&#xff1a;从入门到实践&#xff08;第2版&#xff09;》02-《P…

右键添加 idea 打开功能

1.开始运行regedit 2.找到: HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell _3.开始设置 一、右键shell目录新建项Idea二、右键Idea新建command三、选择Idea 右侧空白出新建字符串 名字为Icon 值填入idea的运行程序地址 四、选择command 默认项填入idea的运行程序地址…

javascript之跳转页面的几种方法?

文章目录 前言代码演示及解释使用location.href属性使用location.assign()方法使用location.replace()方法使用window.open()方法使用document.URL方法 总结 前言 本章学习的是JavaScript中的跳转页面的几种方法 代码演示及解释 使用location.href属性 可以直接将一个新的URL…

LabVIEW的便携式车辆振动测试分析

随着计算机和软件技术的发展&#xff0c;虚拟仪器正逐渐成为机械工业测试领域的主流。在现代机械工程中&#xff0c;特别是车辆振动测试&#xff0c;传统的测试方法不仅设备繁杂、成本高昂&#xff0c;而且操作复杂。为解决这些问题&#xff0c;开发了一款基于美国国家仪器公司…

PostgreSQL 数据库归档最近被问及的问题问题 与 4 毋 处世学

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;共1790人左右 1 2 3 4 5&#xff0…

跑项目报错Cannot find module ‘@babel/preset-env/lib/utils‘

换了电脑之后新电脑 npm install 安装包之后&#xff0c;npm run serve 运行项目出错 &#x1f447;&#x1f447;&#x1f447; npm run serve 运行项目报错 Cannot find module babel/preset-env/lib/utils 根据报错提示查看报错的包路径 可以确定安装的依赖包没有问题&#…

elasticsearch系列四:集群常规运维

概述 在使用es中如果遇到了集群不可写入或者部分索引状态unassigned&#xff0c;明明写入了很多数据但是查不到等等系列问题该怎么办呢&#xff1f;咱们今天一起看下常用运维命令。 案例 起初我们es性能还跟得上&#xff0c;随着业务发展壮大&#xff0c;发现查询性能越来越不…

【第十二课】KMP算法(acwing-831 / c++代码 / 思路 / 视频+博客讲解推荐)

目录 暴力做法 代码如下 KMP算法 不同的next求法-----视频讲解/博客推荐 视频推荐 博客推荐 课本上的方法- prefix的方法- 求next数组思路---next数组存放前缀表的方式 s和p匹配思路 代码如下 暴力做法 遍历s主串中每一个元素&#xff0c;如果该元素等于模板串p中…

SeaTunnel流处理同步MySQL数据至ClickHouse

ClickHouse是一种OLAP类型的列式数据库管理系统&#xff0c;ClickHouse完美的实现了OLAP和列式数据库的优势&#xff0c;因此在大数据量的分析处理应用中ClickHouse表现很优秀。 SeaTunnel是一个分布式、高性能、易扩展、用于海量数据同步和转化的数据集成平台。用户只需要配置…

你的 VSCode 上 还没有 GitHub Copilot ?看这里

GitHub Copilot 是由 OpenAI 和 GitHub 开发的 AI 工具。其目的是通过自动完成代码来帮助开发人员使用集成开发环境 &#xff08;IDE&#xff09;&#xff0c;如 Visual Studio Code。它目前仅作为技术预览版提供&#xff0c;因此只有已加入候补名单的用户才能访问它。对于使用…

OpenAI: InstructGPT的简介

OpenAI: InstructGPT paper: 2022.3 Training Language Model to follow instructions with human feedback Model: (1.3B, 6B, 175B) GPT3 一言以蔽之&#xff1a;你们还在刷Benchamrk?我们已经换玩法了&#xff01;更好的AI才是目标 这里把InstructGPT拆成两个部分&#…

Arduino stm32 USB CDC虚拟串口使用示例

Arduino stm32 USB CDC虚拟串口使用示例 &#x1f4cd;相关篇《STM32F401RCT6基于Arduino框架点灯程序》&#x1f516;本开发环境基于VSCode PIO&#x1f33f;验证芯片&#xff1a;STM32F401RC⌛USB CDC引脚&#xff1a; PA11、 PA12&#x1f527;platformio.ini配置信息&…

线程基础知识(三)

前言 之前两篇文章介绍了线程的基本概念和锁的基本知识&#xff0c;本文主要是学习同步机制&#xff0c;包括使用synchronized关键字、ReentrantLock等&#xff0c;了解锁的种类&#xff0c;死锁、竞争条件等并发编程中常见的问题。 一、关键字synchronized synchronied关键…

android studio 将含有jni c++ 的library项目封装成jar并调用

请参考博客&#xff1a;android studio 4.1.1 将library项目封装成aar 并调用_android studio 4.1 aar release-CSDN博客 一 . 简单叙述 android studio 中可以创建Module 的两种属性&#xff0c;可以在build.gradle 中查看&#xff1a; 1. application属性&#xff1a;可以独…

2023我的编程之路

你的编程学习经历和成长过程&#xff1a; 在我探索编程世界的旅程中&#xff0c;我深刻地认识到&#xff0c;编程不仅仅是一种技术&#xff0c; 是一种思维方式&#xff0c; 一种解决问题的方法。希望通过分享我的编程学习体验&#xff0c;能够启发更多的人看到编程的魅力和价值…

分享70套超治愈的宫崎骏漫画PPT模板

又到了每年最年终总结的时候了&#xff0c;最近都在忙着做总结的PPT&#xff0c;找了好些个模板&#xff0c;希望这些模板也能够对你做PPT有用。 这70套唯美的宫崎骏治愈系PPT模板&#xff0c;适合文艺又与众不同的你。可以用在文艺汇报、工作总结、作品展示、产品介绍等。 Tip…

ssm基于javaweb的数学竞赛网站的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装数学竞赛网站软件来发挥其高效地信息处理的作用&#xff0c…