C++ STL 之可变长数组 Vector 详解

news2024/11/22 19:14:28

文章目录

  • Part.I Attention
    • Chap.I 注意事项
    • Chap.II 操作技巧
  • Part.II Function
    • Chap.I 构造函数
    • Chap.II 增加函数
    • Chap.III 删除函数
    • Chap.IV 遍历函数
    • Chap.V 判断/大小/其他函数
  • Part.III Code

Part.I Attention

Chap.I 注意事项

使用vector需要注意的地方:

  • 加引用#include <vector>
  • 可直接作为『数组』调用,但是!如果要在函数中修改值,一定要加&!!!

Chap.II 操作技巧

一些技巧:

// 将 b 中的元素去重并从小到大排序
sort(b.begin(),b.end());
b.erase(unique(b.begin(),b.end()),b.end());

Part.II Function

在这里插入图片描述

函数一栏表:

函数名含义
begin()返回指向容器中第一个元素的迭代器。
end()返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。
rbegin()返回指向最后一个元素的迭代器。
rend()返回指向第一个元素所在位置前一个位置的迭代器。
size()返回实际元素个数。
max_size()返回元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。
resize()改变实际元素的个数。
capacity()返回当前容量。
empty()判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
reserve()增加容器的容量。
shrink _to_fit()将内存减少到等于当前元素实际所使用的大小。
operator[]重载了 [ ] 运算符,可以向访问数组中元素那样,通过下标即可访问甚至修改 vector 容器中的元素。
at()使用经过边界检查的索引访问元素。
front()返回第一个元素的引用。
back()返回最后一个元素的引用。
data()返回指向容器中第一个元素的指针。
assign()用新元素替换原有内容。
push_back()在序列的尾部添加一个元素。
pop_back()移出序列尾部的元素。
insert()在指定的位置插入一个或多个元素。
erase()移出一个元素或一段元素。
clear()移出所有的元素,容器大小变为 0。
swap()交换两个容器的所有元素。
emplace()在指定的位置直接生成一个元素。
emplace_back()在序列尾部生成一个元素。

Chap.I 构造函数

  • vector()​:创建一个空vector
  • vector(int nSize)​:创建一个vector,元素个数为nSize
  • vector(int nSize,const t& t)​:创建一个vector,元素个数为nSize,且值均为t
  • vector(const vector&)​:复制构造函数
  • vector(begin,end)​:复制[begin,end)区间内另一个数组的元素到vector中

下面是调用构造函数的示例:

// 定义了10个整型元素的向量,初始化为 1
vector<int> a(10,1); 	
// 定义一个二维 vector 向量,所有元素初始化为 1
vector<int> a(10,1);
vector<vector<int>> aa(10,a);
// 通过 int[] 构造并初始化 vector
int b[7] = {1,2,3,4,5,9,8}; 
vector<int> a(b,b+7);
// 直接用数组构造
vector<int> a({1,2,3,4,5,9,8});

Chap.II 增加函数

  • void push_back(const T& x)​:向量尾部增加一个元素X
  • ​iterator insert(iterator it,const T& x)​:向量中迭代器指向元素前增加一个元素x
  • ​iterator insert(iterator it,int n,const T& x)​:向量中迭代器指向元素前增加n个相同的元素x
  • ​iterator insert(iterator it,const_iterator first,const_iterator last)​:向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

下面是一个简单操作实例:

vector<int> a(10,1);	// 10个1
auto itr=a.begin()+3;	// 得到第 3 个迭代器
a.insert(itr,2,8);		// 在迭代器的位置处插入 2 个 8,a=[1  1  1  8  8  1  1  1  1  1  1  1]

Chap.III 删除函数

  • iterator erase(iterator it)​:删除向量中迭代器指向元素
  • ​iterator erase(iterator first,iterator last)​:删除向量中[first,last)中的元素
  • void pop_back()​:删除向量中最后一个元素
  • ​void clear()​:清空向量中所有元素

下面是一个简单操作实例:

auto tmp=a.erase(a.begin()+2,a.begin()+4);
a.pop_back();		// 删除最后一个元素

第一句的含义:删除了vector第 3 个元素到第 5 个元素(不含)共两个元素,返回删除之后的第 3 个元素的迭代器。


Chap.IV 遍历函数

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

注意:

  • vector 可以用[]来获取一个某个索引的元素值,但是不能像 python 那样有切片操作。
  • end()返回的是最后一个元素之后的迭代器,*(vec.end()-1)才是最后一个元素的值
vector<int> b({1,2,3,4,5,6,7,8});
cout<<b.front()<<"  "<<b.back()<<endl;		// 1  8
cout<<*b.begin()<<"  "<<*(b.end()-1)<<endl;	// 1  8

Chap.V 判断/大小/其他函数

  • bool empty() const​:判断向量是否为空,若为空,则向量中无元素
  • int size() const​:返回向量中元素的个数
  • ​int capacity() const​:返回当前向量所能容纳的最大元素值
  • ​int max_size() const​:返回最大可允许的 vector 元素数量值
  • void swap(vector&)​:交换两个同类型向量的数据
  • ​void assign(int n,const T& x)​:设置向量中前n个元素的值为x
  • ​void assign(const_iterator first,const_iterator last)​:向量中[first,last)中元素设置成当前向量元素

	cout<<b.empty()<<endl;
    cout<<b.size()<<"  "<<b.capacity()<<"  "<<b.max_size()<<endl;
    printVec(b);
    b.assign(6,10);     // 指定 b 中的元素为6个10
    printVec(b);
    b.assign(b.begin()+1,b.end()-1); // 去掉 b 第一个元素和最后一个元素
    printVec(b);

Part.III Code

下面是学习 Vector 过程中用到的代码(其实就是上面的代码的汇总):

#include <iostream>
#include <iomanip>
#include <vector>

using namespace std;

int main()
{
    auto printVec=[](vector<int> vec) {for(auto& c:vec) cout << c << "  ";cout << endl;};
    // 构造
    vector<int> a(10,1);
    printVec(a);
    // 插入
    auto itr=a.begin()+3;
    auto tmp = a.insert(itr,2,8);
    cout << *(tmp+1)<<endl;
    printVec(a);
    // 删除
    tmp=a.erase(a.begin()+2,a.begin()+4);// 删除的元素不包含 itr+1
    cout <<* tmp<<endl;
    printVec(a);
    a.pop_back();
    printVec(a);
    // 修改
    a[3]=3;
    a.push_back(4);
    printVec(a);
    // 遍历
    vector<int> b({1,2,3,4,5,6,7,8});
    cout<<b.front()<<"  "<<b.back()<<endl;
    cout<<*b.begin()<<"  "<<*(b.end()-1)<<endl;
    // 其他函数
    cout<<b.empty()<<endl;
    cout<<b.size()<<"  "<<b.capacity()<<"  "<<b.max_size()<<endl;
    printVec(b);
    b.assign(6,10);     // 指定 b 中的元素为6个10
    printVec(b);
    b.assign(b.begin()+1,b.end()-1); // 去掉 b 第一个元素和最后一个元素
    printVec(b);
    getchar();
    return 0;
}

输出如下:

1  1  1  1  1  1  1  1  1  1
8
1  1  1  8  8  1  1  1  1  1  1  1
8
1  1  8  1  1  1  1  1  1  1
1  1  8  1  1  1  1  1  1
1  1  8  3  1  1  1  1  1  4
1  8
1  8
0
8  8  2305843009213693951
1  2  3  4  5  6  7  8
10  10  10  10  10  10
10  10  10  10

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

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

相关文章

分布式与微服务系列 - SpringBoot + Zookeeper集群 + Dubbo分布式托管(提供者、消费者)+ Nginx反向代理

一、前言 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 再搭建集群项目前&#xff0c;请先学习相关技术的知识&#xff1a; 分布式与微服务系列 - Dubbo分布式与微服务系列 - Zookeeper上篇&#xff1a;入门到精通参考文档&#xff1a;分布式与微服务…

状态机——奇葩的状态表示

状态机——奇葩的状态表示 简述 在动态规划中&#xff0c;遇到有一个点有多个状态&#xff0c;混在一起无法表示&#xff0c;那么就可以把状态分开&#xff0c;并且构造出不同状态之间的转移关系&#xff0c;然后再求出状态转移方程&#xff0c;之后就OK了。 题目 1049. 大…

GNN algorithms(3): Tri-party Deep Network Representation

目录 Tri-party Deep Network Representation Essence Thinking Abstract Introduction Problem Definition Tri-DNR pipelines Model Architecture Tri-party Deep Network Representation Essence 1) Deepwalk提取graph structure信息&#xff0c;即structural nod…

MyBatis 一文基础总结

MyBatis 一文基础总结老师的随堂上课笔记&#xff0c; 供参考~1.框架概述1.1 软件开发常用结构1.1.1三层架构三层的处理请求的交互&#xff1a;用户---> 界面层--->业务逻辑层--->数据访问层--->DB 数据库1.1.2 常用框架常见的 J2EE 中开发框架&#xff1a;MyBatis…

adworld-web-inget-20221226

inget 题目来源: 宜兴网信办 题目描述: 无 题目场景: http://61.147.171.105:51222 http://61.147.171.105:51222/?id1%27%20%20or%2011%20– Please enter ID,and Try to bypass nice : congratulations Flag Is : cyberpeace{3df1eecfb5f794d6a94eba429f7e2846} ┌…

【NI Multisim 14.0编辑环境——菜单栏】

目录 序言 一、菜单栏 &#x1f349;1.文件 &#x1f349;2.编辑 &#x1f349;3.视图 &#x1f349; 4.绘制 &#x1f349;5.MCU&#xff08;微控制器&#xff09;菜单 &#x1f349; 6.仿真 &#x1f349; 7.转移 &#x1f349; 8.工具 &#x1f349; 9.报告 &…

录屏有声音吗?电脑如何录屏有声音?图文教程来了!

无论是学习、办公还是娱乐&#xff0c;都需要屏幕录制。许多人在录制视频后发现视频没有发出声音。录屏有声音吗&#xff1f;电脑如何录屏有声音&#xff1f;一个相对简单的方法是在使用电脑的屏幕录制功能时检查是否打开录制屏幕的声音。此外&#xff0c;如果您担心每次都需要…

这应该是全网最全的MySQL数据库的常用命令了吧

目录 前言 数据库的创建 数据表的操作 表数据的增删查改 分组与函数查询 分组与函数查询 运算符&#xff1a;数学运算符 连接查询 前言 今天给大家点来MySQL数据库的常用命令总结&#xff0c;这应该是全网最详细&#xff0c;最实用的数据库命令总结了&#xff0c;因为命…

addr2line

1、符号表 1.1什么是符号表 符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示&#xff1a; <起始地址> <结束地址> <函数> [<文件名:行号>] 1.2为什么要配置符号表 为了能快速并准确地定位引擎发生Crash的代码位置 举个例子…

【UE4 第一人称射击游戏】16-重新装弹

上一篇&#xff1a; 【UE4 第一人称射击游戏】15-修复蹲伏和冲刺同时执行的bug 本章效果&#xff1a; 步骤&#xff1a; 1.打开“Weapon_Base”&#xff0c;添加两个整数类型变量&#xff0c;分别命名为“MaxAmmo”和“ClipSize”&#xff0c;表示最大载弹量和每次重新装弹的…

MATLAB多项式符号运算

符号计算是指在运算时&#xff0c;无须事先对变量进行赋值&#xff0c;而是将所有得到的结果以标准的符 号形式表示出来。符号计算是以符号对象和符号表达式作为运算对象的表达形式&#xff0c;最终给出 的是解析解;在运算过程中不会受到计算误差累积问题的影响&#xff0c;其计…

信息安全编码标准:使用SAST实施安全编码实践

信息安全编码标准:使用SAST实施安全编码实践 当开发团队使用信息安全编码标准来开发软件时&#xff0c;通常希望更少的安全Bug和更好的代码质量&#xff0c;从而给用户带来健壮性更好的产品。在本篇文章中&#xff0c;我们将介绍信息安全编码标准的基础知识、最佳实践、如何以…

【swaggo】swaggo使用详解

一、swagger简介 swagger是一套基于OpenAPI规范构建的开源工具&#xff0c;使用RestApi。swagger-ui 呈现出来的是一份可交互式的API文档&#xff0c;可以直接在文档页面尝试API的调用。     gin-swagger 是基于注释生成 API 文档&#xff0c;项目地址:https://github.com/…

vulfocus复现:log4j2-rce-2021-12-09

文章目录一、漏洞影响二、复现过程一、漏洞影响 Apache Log4j 是一个基于Java的日志记录工具。经过多年的开发迭代&#xff0c;Log4j 1.x的维护已经变得非常困难&#xff0c;因为它需要与非常旧的 Java 版本兼容&#xff0c;所以于 2015 年 8 月正式升级为Log4j2。黑客可以恶意…

【C++】堆与二叉树(非常详细,附带堆排哦)

之前学习了很多的数据结构 有顺序表&#xff0c;堆&#xff0c;栈... 今天学习一种新的逻辑结构二叉树&#xff0c;他的物理结构是堆 让我们先简单回顾一下堆吧堆的简单介绍和一些简单功能的实现 1. 二叉树 其实堆就是一种特殊的数组&#xff0c;他的逻辑结构是二叉树 &#…

汽车OTA概述

文章目录 前言一、软件更新二、ECU刷写包复用 1.引入库2.读入数据总结前言 掌握OTA&#xff08;Over-The-Air&#xff0c;无线技术&#xff09;&#xff0c;汽车领域与IT领域正在技术融合&#xff01; 技术更新&#xff0c;也增加了车载应用场景&#xff0c;软件更新、实时诊…

内存管理的关键技术——反向映射机制

Cheetah&#xff0c;曾为U-boot社区和Linux内核社区提交过若干补丁&#xff0c;主要从事Linux相关系统软件开发工作&#xff0c;负责Soc芯片BringUp及系统软件开发&#xff0c;喜欢阅读内核源代码&#xff0c;在不断的学习和工作中深入理解内存管理&#xff0c;进程调度&#x…

大数据技术——Flume实战案例

实战案例目录1. 复制和多路复用1.1 案例需求1.2 需求分析1.3 实现操作2. 负载均衡和故障转移2.1 案例需求2.2 需求分析2.3 实现操作3. 聚合操作3.1 案例需求3.2 需求分析3.3 实现操作1. 复制和多路复用 1.1 案例需求 使用 Flume-1 监控文件变动&#xff0c;Flume-1 将变动内容…

图文详解二维差分

目录 前言 一、 二维差分的定义 二、二维差分的使用 三、计算二维差分 四、ACWing 798. 差分矩阵 前言 一维二维前缀和详解 图文详解一维差分 一、 二维差分的定义 对于一个给定的二维数组 arr&#xff0c;它的二维差分数组 d 中 d[i][j] 可以用如下公式计算&#xff1a;…

命令执行-无字母数字webshell

命令执行-无字母数字webshell 我们看如下代码&#xff1a; <?php if(!preg_match(/[a-z0-9]/is,$_GET[shell])) {eval($_GET[shell]); }在命令执行中&#xff0c;我们经常会碰到过滤了字母和数字的情况&#xff0c;那如何才能绕过呢&#xff1f; 我的想法&#xff1a;通…