C++知识点总结(32):STL(vector)

动态数组 vector

  • 一、概念
    • 1. 意义
    • 2. 优点
    • 3. 一维动态数组
      • (1) 定义
      • (2) 功能函数
      • (3) 注意事项
    • 4. 二维动态数组
      • (1) 二维静态数组的局限
      • (2) 二维动态数组操作
        • a. 定义
        • b. 初始化
    • 5. 迭代器
      • (1) 概念
      • (2) 定义
      • (3) 遍历
      • (4) 功能函数
  • 二、例题
    • 1. 命令列表
      • (1) 审题
      • (2) 参考答案
    • 2. 借阅表格
      • (1) 审题
      • (2) 参考答案
        • a. 普通写法
        • b. 结构体
    • 3. 物品档案柜
      • (1) 审题
      • (2) 参考答案

一、概念

1. 意义

vector 翻译为向量,一般说成动态数组。
在插入数据或者新增数据时,数组会动态的拓展长度,即“长度根据需要而自动改变的数组”,整个过程无需人工干预,也不需要实现固定长度。

2. 优点

  • 动态
  • 随机访问
  • 插入删除方便

3. 一维动态数组

(1) 定义

格式:vector<数据类型>动态数组名;

#include <vector>
vector<int>vec;

(2) 功能函数

方法功能常用程度
.push_back(x)在尾部增加一个元素 x x x⭐⭐⭐
.pop_back()删除最后一个元素
.front()返回首元素
.back()返回尾数组
.size()返回元素个数⭐⭐⭐
.empty()判断是否为空⭐⭐⭐
.resize(n)改变实际大小变为 n n n⭐⭐
.begin()返回指向第一个元素的迭代器
.end()返回指向最后一个元素的下一个位置的迭代器
.erase()删除迭代器指向元素⭐⭐
.clear()清空所有元素⭐⭐⭐
.at(pos)返回 p o s pos pos 位置元素的值
.max_size()返回最大可允许的元素数量值

(3) 注意事项

  • .resize(n) 如果 n n n 比原来的实际大小更小,那么只会留下前面的 n n n 个元素。
  • .at(pos) 如果越界会产生提示报错。

4. 二维动态数组

(1) 二维静态数组的局限

  • 大小固定:在编译时就需要确定,并且无法在运行时改变。如果数组大小超出了预设的限制,就无法存储更多的数据。
  • 内存浪费:在编译时就需要分配内存空间,使用的空间如果没有占满,内存就会造成极大浪费。

(2) 二维动态数组操作

a. 定义
// 方法一:vector的数组
vector<int> a[105];// 方法二:vector的vector
vector <vector<int> > a;
a.resize(105);
b. 初始化
// 方法一:vector的vector
vector<vector<int> > vec={{1,2},{3,4},{5,6}};// 方法二:vector的vector数组
vector<vector<int> > vec(4, vector<int>(5));// 方法三:全部初始化为0
vector<vector<int> > vec(4, vector<int>(5,0));

5. 迭代器

(1) 概念

迭代器的作用和指针类似,可以通过引用(*)操作访问其指向的元素内容。
常用的容器(例如 mapsetvector 等)都可以使用一对迭代器来表示范围。

(2) 定义

#include <vector>
vector<int>::iterator it;

(3) 遍历

for (it = vec.begin(); it != vec.end(); it++)
{cout << *it << " ";
}

(4) 功能函数

方法功能常用程度
.insert(it, x)迭代器 it 指向的元素前添加一个元素 x x x⭐⭐⭐
.erase(it)删除迭代器 it 指向的元素⭐⭐⭐
.begin()返回指向第一个元素的迭代器⭐⭐⭐
.end()返回指向最后一个元素的下一个位置的迭代器⭐⭐⭐
reverse(l, r+1)翻转 l l l r r r 范围的元素⭐⭐
.insert(it, n, x)迭代器 it 指向元素前增加 n n n 个相同的元素 x x x⭐⭐
.insert(it, l, r+1)迭代器 it 指向元素前插入另一个相同类型向量的 l l l r r r 之间的数据⭐⭐
.erase(l, r+1)删除 l l l r r r 范围的元素⭐⭐
.rbegin()反向迭代器,指向最后一个元素
.rend()反向迭代器,指向第一个元素之前的位置

二、例题

1. 命令列表

(1) 审题

题目描述

逛公园的时候,你捡到一个神奇的对讲机,这个对讲机有一个命令列表,列表上的命令分别有三种操作:
a) increase,表示向列表的最后面添加一个数字(列表中的元素唯一);
b) remove,表示删除列表的第一个元素;
c) least,表示删除列表中的数字中值最小的那一个。

输入描述

第一行会给出一个数字 N,表示你会执行的命令数量。接下来的 N N N 行中,每行都开始于一个字符串 S S S S S S 有三种可能:increaseremoveleast

输出描述

对于每一个操作,请给出适当的答案。
对于 incerase 操作,输出列表此刻的元素个数;
对于 remove 操作,那么删除列表头的元素并输出它。如果列表为空,不输出内容;
对于 least 命令,删除列表中值最小的那一个并输出它。如果列表为空,不输出内容。

样例1

输入

6
increase 5
increase 3
increase 7
increase 2
remove
least

输出

1
2
3
4
5
2

提示

对于 80 % 80\% 80% 的数据, 0 ≤ X ≤ 1 0 9 0≤X≤10^9 0X109 0 ≤ N ≤ 100 0≤N≤100 0N100
对于 100 % 100\% 100% 的数据, 0 ≤ X ≤ 1 0 9 0≤X≤10^9 0X109 0 ≤ N ≤ 5 × 1 0 4 0≤N≤5\times10^4 0N5×104,保证不会都是添加操作。

(2) 参考答案

#include <iostream>
#include <vector>
#include <string>
using namespace std;int n;
int x;
vector<int> vec;int main()
{cin >> n;while (n--){string comm;cin >> comm;if (comm == "increase"){cin >> x;vec.push_back(x);cout << vec.size() << endl;}else if (comm == "remove"){cout << vec[0] << endl;if (!vec.empty()){vec.erase(vec.begin());}}else if (comm == "least"){if (!vec.empty()){int pos;int minn = 1e9;int len = vec.size();for (int i = 0; i < len; i++){if (vec[i] < minn){minn = vec[i];pos = i;}}cout << minn << endl;vec.erase(vec.begin() + pos);}}}return 0;
}

如果学过 min_element 的同学也可以这么写:

#include <algorithm>
else if (comm == "least")
{if (!vec.empty()){int minn = min_element(vec.begin(), vec.end());cout << *minn << endl;vec.erase(minn);}
}

2. 借阅表格

(1) 审题

题目描述

在一个图书馆系统中有 N N N 条借阅书籍记录,每条记录包含读者名和书籍名。每个读者都有一个唯一的读者名,每个读者名是一个只含小写字母且长度小于 1000 1000 1000 的字符串。每个读者每次借阅书籍的名称也是一个只含小写字母且长度小于 1000 1000 1000 的字符串,每次借阅书籍的记录都会被记录下来,现在需要统计每个读者分别借阅了哪些书籍。

输入描述

1 1 1 行包含一个正整数 N N N
2 N + 1 2~N+1 2 N+1 行,每行包含 2 2 2 个用 1 1 1 个空格隔开的字符串,分别表示读者名和借阅的书籍名称。

输出描述

多行,每行的第一个字符串是读者名,接下来的若干字符串是这个读者依次借阅的书籍名称(之间用一个空格隔开)。按照读者名出现的次序排序输出。

样例1

输入

7
joan pride
nikia ulysses
joan prejudice
nikib ulysses
nikic ulysses
nikia moby
betty dack

输出

joan pride prejudice
nikia ulysses moby
nikib ulysses
nikic ulysses
betty dack

提示

80 % 80\% 80% 的数据保证, 1 ≤ N ≤ 500 1≤N≤500 1N500
100 % 100\% 100% 的数据保证, 1 ≤ N ≤ 50000 1≤N≤50000 1N50000,且不会都是同一个人的阅读记录。

(2) 参考答案

a. 普通写法
#include <iostream>
#include <vector>
#include <string>
using namespace std;int n;
vector<string> names;
vector<vector<string>> books;int main()
{cin >> n;while (n--){string name, book;cin >> name >> book;// 判断名字是否第一次出现bool flag = false;for (int i = 0; i < names.size(); i++){if (names[i] == name) // 出现过{books[i].push_back(book);flag = true;break;}}if (!flag) // 没出现过{// 记录人名names.push_back(name);// 记录书名books.push_back({});int pos = names.size()-1;books[pos].push_back(book);}}// 输出表格for (int i = 0; i < names.size(); i++){cout << names[i] << " ";for (int j = 0; j < books[i].size(); j++){cout << books[i][j] << " ";}cout << endl;}return 0;
}
b. 结构体
#include <iostream>
#include <vector>
#include <string>
using namespace std;struct Node
{string reader;vector <string> books;
};int n;
vector <Node> names;int main()
{cin >> n;while (n--){string name, book;cin >> name >> book;bool flag = false;for (int i = 0; i < names.size(); i++){if (names[i].reader == name){names[i].books.push_back(book);flag = true;break;}}if (!flag){Node x;x.reader = name;x.books.push_back(book);names.push_back(x);}}for (int i = 0; i < names.size(); i++){cout << names[i].reader << " ";for (int j = 0; j < names[i].books.size(); j++){cout << names[i].books[j] << " ";}cout << endl;}return 0;
}

3. 物品档案柜

(1) 审题

题目描述

学校里有 n n n 个学生物品档案柜。每个档案柜的格子数量不一,第 i i i 个档案柜有 a i a_i ai 个格子。每个格子编号从 1 1 1 开始到 a i a_i ai。现在有 q q q 次操作。
1 i j k:在第 i i i 个柜子的第 j j j 个格子中存入物品 k k k。当 k = 0 k=0 k=0 时说明清空该格子。
2 i j:查询第i个柜子的第 j j j 个格子中物品是什么,保证查询的格子中有存过东西。假设学校里共计不会超过 1 0 7 10^7 107 个档案柜格子, a i a_i ai 是确定而未知的,但是保证一定不小于该档案柜存物品请求的格子编号的最大值。有些档案柜中可能一个格子都没有。

输入描述

第一行 2 2 2 个整数 n n n q q q,档案柜个数和操作次数。
接下来 q q q 行,每行代表一次操作。

输出描述

对于查询操作时,输出答案,两个答案之间以换行隔开。

样例1

输入

5 4
1 3 10000 118014
1 1 1 1
2 3 10000
2 1 1

输出

118014
1

提示

1 ≤ n , a i , q ≤ 1 0 5 1≤n,a_i,q≤10^5 1n,ai,q105

(2) 参考答案

#include <iostream>
#include <vector>
using namespace std;vector<int> a[100005];
int n, q;int main()
{cin >> n >> q;while (q--){int comm, i, j, k;cin >> comm;if (comm == 1) // 存入{cin >> i >> j >> k;if (j >= a[i].size()){a[i].resize(j+1);}a[i][j] = k;}else if (comm == 2) // 查询{cin >> i >> j;cout << a[i][j] << endl;}}return 0;
}

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

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

相关文章

c语言排序算法之六(选择排序)

前言 以下内容是被验证可以有效理解选择排序&#xff0c;代码也较容易理解。如果你发现还有很多需要增加的&#xff0c;欢迎留言。 为什么要单独写排序算法这一系列&#xff0c;看过一些贴子普遍篇幅较长。看完还依旧云里雾里&#xff0c;难以直观理解原理及整个过程。代码永…

【JavaEE 初阶(二)】线程安全问题

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.synchronized2.1例子2.2synchronized修饰代码块2.3 synchronized修饰方法2.4sy…

0x003 SQLMAP如何检测是否存在SQL注入

0x003 SQLMAP如何检测是否存在SQL注入 我们直接看到lib.controller.controller​中的strat()​方法 因为start()​代码较长,所以我们这里就调重要的代码进行分析 parseTargetUrl()testSqlInj Falseif PLACE.GET in conf.parameters and not any((conf.data, conf.testParam…

linux中Could not load [org.bouncycastle.jcajce.provider.symmetric.RC2$KeyGen

问题描述 在linux中部署java项目&#xff0c;项目中有使用凭证加密。 解决方法 查询项目使用Java的在系统中的位置&#xff1b;找到对应java的jre路径&#xff1b;将bcprov-jdk14-127.jar放入JAVA_HOME/jre/lib/ext下&#xff1b;打开JAVA_HOME/jre/lib/security下的java.se…

分布式领域计算模型及SparkRay实现对比

目录 一、分布式计算领域概览 二、Spark计算模型分析 三、Ray计算模型分析 3.1 需求分析 3.2 系统设计 3.3 系统实现 四、总结 一、分布式计算领域概览 当前分布式计算模型主要分为以下4种&#xff1a; Bulk Synchronous Parallel Model&#xff08;块同步并行模型&…

【Linux 11】进程地址空间

文章目录 &#x1f308; Ⅰ 虚拟地址引入&#x1f308; Ⅱ 虚拟地址空间&#x1f308; Ⅲ 页表 (解释 fork() 的返回值既 > 0 又 0)&#x1f308; Ⅳ 什么是地址空间&#x1f308; Ⅴ 为什么要有地址空间 &#x1f308; Ⅰ 虚拟地址引入 现在通过一段代码来观察一个现象&a…

初识指针(1)<C语言>

前言 指针是C语言中比较难的一部分&#xff0c;大部分同学对于此部分容易产生“畏难情结”&#xff0c;但是学习好这部分对C语言的深入很大的帮助&#xff0c;所以此篇主要以讲解指针基础为主。 指针概念 变量创建的本质就是在内存中申请空间&#xff0c;找到这个变量就需要地址…

GO语言核心30讲 实战与应用 (第一部分)

原站地址&#xff1a;Go语言核心36讲_Golang_Go语言-极客时间 一、测试的基本规则和流程 1. GO程序主要分三类测试&#xff1a;功能测试、性能测试&#xff0c;以及示例测试。 示例测试和功能测试差不多&#xff0c;但它更关注程序打印出来的内容。 2. 测试文件的名称应该以…

交互中的“互”难以产生的原因

脑机交互技术的目标是通过分析和解读大脑活动&#xff0c;将其与特定的意图、指令或行为连接起来。通过训练和分析&#xff0c;可以建立起大脑活动与特定行为或意图之间的关联模型&#xff0c;从而实现脑机交互的应用&#xff0c;例如控制外部设备、传递信息等。然而&#xff0…

Python机器学习实验 Python 数据可视化

1.实验目的 掌握 Matplotlib 数据可视化的常用方法。 2.实验内容 1. 绘制鸢尾花数据集的特征分布图 说明&#xff1a;鸢尾花是单子叶百合目花卉&#xff0c;是一种比较常见的花&#xff0c;鸢尾花的品种较多。 鸢尾花数据集最初由 Edgar Anderson 测量得到&#xff0c;而后在…

android中给view添加遮罩层

1.在 res 目录中添加 id : <?xml version"1.0" encoding"utf-8"?> <resources><item name"view_mask_id" type"id" /> </resources> 2.扩展方法: /** 给一个 View 添加一层由 [res] 填充的遮罩层布局, 可…

深入学习和理解Django模板层:构建动态页面

title: 深入学习和理解Django模板层&#xff1a;构建动态页面 date: 2024/5/5 20:53:51 updated: 2024/5/5 20:53:51 categories: 后端开发 tags: Django模板表单处理静态文件国际化性能优化安全防护部署实践 第一章&#xff1a;模板语法基础 Django模板语法介绍 Django模…

每天五分钟深度学习:数学中常见函数中的导数

本文重点 导数是微积分学中的一个核心概念,它描述了函数在某一点附近的变化率。在物理学、工程学、经济学等众多领域中,导数都发挥着极其重要的作用。本文旨在详细介绍数学中常见函数的导数,以期为读者提供一个全面而深入的理解。 数学中常见的导数 常数函数的导数 对于常数…

ctfshow 框架复现

文章目录 web 466web 467web 468web469web 470web 471web 472web 473web 474web 475web 476 web 466 Laravel5.4版本 &#xff0c;提交数据需要base64编码 代码审计学习—Laravel5.4 - 先知社区 (aliyun.com) 用第二条链子 反序列化格式 /admin/序列化串base64<?php na…

大模型在自动驾驶领域的应用

大模型在自动驾驶领域的应用主要体现在以下几个方面&#xff1a; 1. **感知与识别**&#xff1a;自动驾驶车辆需要准确地感知周围环境&#xff0c;包括其他车辆、行人、交通标志等。大型深度学习模型&#xff0c;如卷积神经网络&#xff08;CNN&#xff09;和递归神经网络&…

(论文阅读-多目标优化器)Multi-Objective Parametric Query Optimization

目录 摘要 一、简介 1.1 State-of-the-Art 1.2 贡献和大纲 二、定义 三、相关工作 四、问题分析 4.1 分析 4.2 算法设计影响 五、通用算法 5.1 算法概述 5.2 完备性证明 六、分段线性代价函数算法 6.1 数据结构 6.2 基本运算实现 6.3 复杂度分析 七、实验评估 …

FR-TSN4206获得“时间敏感网络产业链名录计划”测试认证证书,TSN交换机助力智能工业发展

TSN技术&#xff0c;即时间敏感网络技术&#xff0c;已成为智能工业、自动驾驶等领域的核心。它通过时钟同步、数据调度等功能&#xff0c;确保低延迟、高可靠性的数据传输。 为推动TSN技术在我国的发展&#xff0c;工业互联网产业联盟联合多家单位启动了“时间敏感网络产业链名…

Amazon EKS创建EFS存储卷

1、创建Amazon EFS CSI 驱动程序 亚马逊相关文档 在 Select trusted entity&#xff08;选择受信任的实体&#xff09;页面上操作 在 Add permissions&#xff08;添加权限&#xff09;页面上筛选AmazonEFSCSIDriverPolicy操作 记得将AmazonEBSVolumePolicy添加到我们创建的…

Colab/PyTorch - Getting Started with PyTorch

Colab/PyTorch - Getting Started with PyTorch 1. 源由2. 概要2.1 PyTorch是什么&#xff1f;2.2 为什么学习PyTorch&#xff1f;2.3 PyTorch库概览 3. 步骤4. 预期&展望5. 总结6. 参考资料 1. 源由 世界在发展&#xff0c;为其服务的技术也在不断演变。每个人都要跟上技…

Docker-Compose 容器集群的快速编排

Docker-compose 简介 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是 工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&#xff09;以及容器&…