C++ STL 之容器 vector 常见用法

一. 什么是vector

vector为“变长数组”,即长度根据需要而自动改变的数组。
头文件:

	#include <vector>using namespace std;

单独定义一个vector:vector<typename> name,相当于一维数组 name[SIZE] ,其长度可以根据需要变化,比较节省空间。
和一维数组一样,这里的 typename 可以是任何基本类型,如 int, double, char, 结构体等,也可以是STL标准容器,如vector, set, queue等。
在C++11之前,如果 typename 是一个STL容器,定义时需要在 >> 符号之间加空格,否则编译器会将它视为移位操作,导致编译错误。
例子:

	vector<int> name;vector<char> name;vector<node> name;  		//node为结构体类型vector<vector<int>> name;	//二维数组,两个维都可以变长//二维数组,一维长度固定为100,另一维变长,name[0]~name[99]每一个都是一个vector容器vector<int> name[100];

二. vector的初始化

  1. 不带参数的构造函数初始化
	//初始化一个size为0的空vectorvector<int> abc;
  1. 带参数的构造函数初始化
	//初始化size,但每个元素值为默认值vector<int> abc(10);		//初始化了10个默认值为0的元素//初始化size,并且设置初始值vector<int> cde(101);		//初始化了10个值为1的元素
  1. 通过复制同类型的vector初始化
	vector<int> a(5,1);//通过复制a初始化vector<int> b(a);
  1. 通过复制 [begin,end) 区间内另一个数组的元素到vector中来进行初始化
	int a[5] = {1,2,3,4,5};//通过数组a的地址初始化,注意地址是 [0, 5)vector<int> b(a, a+5);

三. vector容器内元素的访问

  1. 通过下标访问
    和访问普通数组一样,对一个定义为vector<typename> name的vector容器来说,直接访问 name[index] 即可(如name[0], name[1])。这里的下标是从0到name.size() - 1,访问这个范围外的元素可能会运行出错。

  2. 通过迭代器访问
    迭代器(iterator)可以理解为一种类似指针的东西,其定义为: vector<typename>::iterator it;这里 it 就是一个vector<typename>::iterator型的变量,可以通过 *it来访问vector中的元素。
    在常用STL容器中,只有在vector和string中,才允许使用 name.begin() + 3 这种迭代器加上整数的写法。

	//name.begin()为取name的首元素地址,it指向这个地址vector<int>::iterator it = name.begin();for(int i = 0; i < name.size(); i++){printf("%d ", *(it + i));	//输出name[i]}//循环条件使用it != name.end(),不支持it < name.end()写法for(vector<int>::iterator it = name.begin(); it != name.end(); it++){printf("%d ", *it);}

四. vector常用函数

1. 添加

  • void push_back(const T& x):在vector尾部添加一个元素x
  • iterator insert(iterator it, const T& x):向vector中迭代器 it 处的前方插入一个元素x
  • iterator insert(iterator it, int n, const T& x):向vector中迭代器 it 处的前方插入 n 个相同的元素x
  • iterator insert(iterator it, const_iterator first, const_iterator last):向vector中迭代器 it 处插入另一个相同类型vector的 [first,last) 间的数据
	vector<int> name;name.push_back(1);		//1vector<int>::iterator it = name.begin();name.insert(it, 2);		//2 1name.insert(it, 2, 3);	//3 3 2 1vector<int> a(2, 0);name.insert(it, a.begin(), a.begin() + 1);  //0 0 3 3 2 1

2. 删除

  • void pop_back():删除vector中最后一个元素
  • void clear():清空vector中所有元素
  • iterator erase(iterator it):删除vector中迭代器 it 指向的元素
  • iterator erase(iterator first, iterator last):删除vector中 [first,last) 范围内的元素
	//0 0 3 3 2 1name.pop_back();	//0 0 3 3 2vector<int>::iterator it = name.begin();name.erase(it);		//0 3 3 2name.erase(it, it + 1); //3 2name.clear();

3. 遍历

  • iterator begin():返回向量头指针,指向第一个元素
  • iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
  • reference at(int pos):返回 pos 位置元素的引用
  • reference front():返回首元素的引用
  • reference back():返回尾元素的引用
  • reverse_iterator rbegin():反向迭代器,指向最后一个元素,即将vector反转后,返回第一个元素
  • reverse_iterator rend():反向迭代器,指向第一个元素之前的位置,即将vector反转后,返回最后一个元素

4. 判断

  • bool empty() const:判断向量是否为空,若为空,则向量中无元素
	if(name.empty()) return false;

5. 大小

  • int size() const:返回向量中元素的个数
	int len = name.size();

6. 通过copy函数赋值

	vector<int> a(5,1);int a1[5] = {2,2,2,2,2};vector<int> b(10);//将a中元素全部拷贝到b开始的位置中,注意拷贝的区间为a.begin() ~ a.end()的左闭右开的区间copy(a.begin(), a.end(), b.begin());//拷贝区间也可以是数组地址构成的区间copy(a1, a1+5, b.begin() + 5);

五. vector排序

1. 从小到大(升序)

sort排序默认升序,头文件:#include <algorithm>

	int a[] = {8,6,2,9,3,5,4,1,7,10};vector<int> arr(a, a+5);sort(arr.begin(),arr.end());	//升序

2. 从大到小(降序)

  • (1)greater<int>()
    sort默认排序从小到大,使用greater<int>()
	int a[] = {8,6,2,9,3,5,4,1,7,10};vector<int> arr(a, a+5);sort(arr.begin(),arr.end(),greater<int>());	//降序
  • (2)自定义函数 bool cmp(int x, int y);
bool cmp_max(int x,int y){return x > y;
}int main() {int a[] = {8,6,2,9,3,5,4,1,7,10};vector<int> arr(a, a+5);sort(arr.begin(), arr.end(), cmp_max); for(int i = 0; i < arr.size(); i++){printf("%d ", arr[i]);}		 return 0 ;}
  • (3)使用sort排序后,再使用reverse() ,reverse()将元素倒置
 	sort(arr.begin(),arr.end());		//升序排列reverse(arr.begin(),arr.end());		//将数组倒置
  • (4)使用反向迭代器 rbegin() 和 rend()
      // sorts arr in "normal" ordersort(arr.begin(), arr.end());// sorts in reverse: puts smallest element at the end of arrsort(arr.rbegin(), arr.rend());

关于反向迭代器,详见这篇博客:c++ vector begin(),end(),rbegin(),rend()问题 (C++ primer (中文版第四版) 第273页)

3. 对结构体vector使用sort排序

当vector中的数据类型为自定义结构体类型时(元素大于等于2),想以其中某一个元素进行正序或逆序排序,则不能直接使用sort函数,通过自定义比较函数 cmp 实现排序。

#include <bits/stdc++.h>
using namespace std;struct Point2{int x;int y;
};
bool GreaterSort (Point2 a,Point2 b) { return (a.x > b.x); }
bool LessSort (Point2 a,Point2 b) { return (a.x < b.x); }
int main(){vector<Point2> aaa;Point2 temp;temp.x=1;temp.y=1;aaa.push_back(temp);temp.x=2;temp.y=2;aaa.push_back(temp);	temp.x=3;temp.y=3;aaa.push_back(temp);//降序排列sort(aaa.begin(),aaa.end(), GreaterSort);cout<<"Greater Sort:"<<endl;for (int i =0;i<aaa.size();i++){cout<<aaa[i].x<<"	"<<aaa[i].y<<endl;}//升序排列sort(aaa.begin(),aaa.end(),LessSort);cout<<"Less Sort:"<<endl;for (int i =0;i<aaa.size();i++){cout<<aaa[i].x<<"	"<<aaa[i].y<<endl;}return 0;
}

运行结果:

Greater Sort:
3       3
2       2
1       1
Less Sort:
1       1
2       2
3       3

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

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

相关文章

mac-docker-php容器连接mac中的pgsql数据库失败以及出现table_msg存错误时的解决方法

以php中的thinkphp 5.1为例&#xff0c;php容器连接mac中的pgsql数据库失败时&#xff0c;出现如下错误 [7] PDOException in Connection.php line 528 SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "localhost&…

Git 配置处理客户端无法正常访问到 github 原网站时,npm 下载依赖包失败的问题

Git 配置处理客户端无法正常访问到 github 原网站时&#xff0c;npm 下载依赖包失败的问题 使用 github 的镜像网站地址或类似的替代产品地址&#xff0c;代替到 npm 拉取依赖包的 git 地址本地Git配置 例如&#xff1a;执行一下命令&#xff0c;则是以https://kgithub.com 替…

requests库/urllib3库返回WEB响应内容的处理差异

requests库是一个广泛使用的HTTP库&#xff0c;用于发送HTTP请求和处理响应。 以下是requests库中一些主要类和方法的详细介绍&#xff1a;requests库主要类和方法 类:requests.models.Response: status_code: 响应状态码。text: 以Unicode形式返回响应内容。content: 以字节形…

MySQL的主从同步原理

MySQL的主从同步&#xff08;也称为复制&#xff09;是一种数据同步技术&#xff0c;用于将一个MySQL服务器&#xff08;主服务器&#xff09;上的数据和变更实时复制到另一个或多个MySQL服务器&#xff08;从服务器&#xff09;。这项技术支持数据备份、读写分离、故障恢复等多…

帝国cms7.5仿非小号区块链门户资讯网站源码 带手机版

帝国cms7.5仿非小号区块链门户资讯网站源码 带手机版 带自动采集 开发环境&#xff1a;帝国cms 7.5 安装环境&#xff1a;phpmysql 包含火车头采集规则和模块&#xff0c;采集目标站非小号官网。 专业的数字货币大数据平台模板&#xff0c;采用帝国cms7.5内核仿制&#xff0…

LeetCode_22_中等_括号生成

文章目录 1. 题目2. 思路及代码实现&#xff08;Python&#xff09;2.1 暴力法2.2 回溯法 1. 题目 数字 n n n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a; n 3 n 3 …

Ai-WB2-32S在window下使用vs 和 msys2编译以及烧录

文章目录 前言一、使用前准备第一步 安装vscode第二步 安装msys2 二、使用步骤1.打开MSYS2 MINGW64&#xff08;1&#xff09;在开始栏中找到MSYS2 MINGW64并打开&#xff08;2&#xff09;安装git&#xff08;3&#xff09;安装make&#xff08;4&#xff09;安装好之后的文件…

前端面试练习24.3.1

一.进程和线程的区别 进程&#xff1a;是程序的一次执行过程,拥有独立的内存空间 线程&#xff1a;是进程中的一个执行单元,共享所属进程的内存空间和系统资源 进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是操作系统中的重要概念&#xff0c;它…

Redis 之五:Redis 的主从复制

概念 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&#xff0c;每台Redis服务器都是主节…

【0272】postgres内核分配 MyBackendId 实现原理(MyBackendId、MyProc、shmInvalBuffer)(三)

相关文章: 【0255】揭晓pg内核中MyBackendId的分配机制(后端进程Id,BackendId)(一) 【0256】揭晓pg内核中MyBackendId的分配机制(后端进程Id,BackendId)(二) 第一个backend process前,shmInvalBuffer的值情况 (gdb) p *shmInvalBuffer $153 = {minMsgNum =

webpack-cli

webpack-cli做了什么 webpack-cli 是 Webpack 提供的命令行工具&#xff0c;用于在命令行中执行 Webpack 相关的操作。webpack-cli 主要完成以下几项工作&#xff1a; 解析和处理命令行参数&#xff1a;webpack-cli 负责解析用户在命令行中输入的参数&#xff0c;包括配置文件…

云天励飞战略投资神州云海,布局机器人市场

日前,AI上市企业云天励飞(688343.SH)完成了对深圳市神州云海智能科技有限公司(以下简称“神州云海”)的B轮战略投资。 公开资料显示,自2015年于深圳创立以来,神州云海始终聚焦人工智能与服务机器人广阔的应用市场,依托自主的核心算法能力,深耕机器人硬件本体研发,整合上下游产…

Java学习笔记001——入门基础知识

Java语言是一种高级编程语言&#xff0c;它采用了面向对象编程的思想&#xff0c;具有跨平台性和安全性等优点。现如今&#xff0c;Java语言成为了世界上最流行的编程语言之一。 前一段学习Python语言&#xff0c;本文是学习java的第一篇笔记。 1. java运行环境搭建&#xff…

RabbitMQ-TTL/死信队列/延迟队列高级特性

文章目录 TTL死信队列消息成为死信的三种情况队列如何绑定死信交换机 延迟队列RabbitMQ如何实现延迟队列 总结来源B站黑马程序员 TTL TTLTTL(Time To Live):存活时间/过期时间当信息到达存活时间后&#xff0c;还没有被消费&#xff0c;会被自动清除。RabbitMQ可以对消息设置过…

Win10系統如何重置系统

Win10系統如何重置 大家可以使用Win10內建的重設電腦設定&#xff0c;如以下操作&#xff1a; 首先&#xff0c;可以先到桌面左下角的【開始】 選擇【設定】 在【設定】裡找到【更新與安全性】 在左側欄有一項【復原】 在復原的標題下&#xff0c;副標題有一項【重設此電腦】…

【algorithm】算法基础课---排序算法(附笔记 | 建议收藏)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;AcWing算法学习笔记 &#x1f4ac;总结&#xff1a;希望你看完…

tvm交叉编译参考资料整理

环境 ubuntu20.04&#xff0c;ndk交叉编译部署到adnroid手机 参考&#xff1a; TVM部署神经网络模型到android端_tvm android-CSDN博客 使用TVM在android中进行Mobilenet SSD部署 - 知乎

深度探析低代码:助力“数智转型”赋能中国制造

随着数字化和智能化技术的飞速发展&#xff0c;我国制造业正面临着从传统制造向智能制造的转型升级。在这个过程中&#xff0c;低代码技术作为一种创新性的软件开发模式&#xff0c;逐渐成为助力我国制造业数智转型的关键驱动力。本文将从低代码技术的原理、应用场景以及在我国…

​The Sandbox的南极之旅|链接世界:从南极洲到元宇宙

真正的发现之旅不在于寻找新的景观&#xff0c;而在于拥有新的眼光。 - 马塞尔-普鲁斯特 在这个数字世界和物理世界日益交织的时代&#xff0c;The Sandbox 的联合创始人 Arthur Madrid 和 Sebastien Borget 踏上了远离数字空间的旅程&#xff0c;前往地球上未被开发的宝藏地点…

无用工作、UBI与AI

有些隐晦和黑暗的事实无法陈述&#xff0c;因为任何的系统中“无用”的结局都是被无情的抛弃和淘汰&#xff0c;AI监督下的人类结局更是如此。 什么是无用工作&#xff1f; 无用无效工作通常指的是那些看似忙碌但实际上对社会或个人没有实质性贡献的工作。这类工作可能包括以下…