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.mfbz.cn/a/594551.html

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

相关文章

leetCode81. 搜索旋转排序数组 II

leetCode81. 搜索旋转排序数组 II 题目思路 可以二分后的具体思路见我的上篇博客 搜索旋转排序数组 代码 class Solution { public:bool search(vector<int>& nums, int target) {if(nums.empty()) return false;int R nums.size() - 1;while(R > 0 &&…

LLMs:《Better Faster Large Language Models via Multi-token Prediction》翻译与解读

LLMs&#xff1a;《Better & Faster Large Language Models via Multi-token Prediction》翻译与解读 目录 《Better & Faster Large Language Models via Multi-token Prediction》翻译与解读 Abstract 2、Method方法 Memory-efficient implementation 高效内存实…

LabVIEW数据库访问技术

LabVIEW数据库访问技术 在当前的信息化时代&#xff0c;数据管理与分析在各个领域中起着重要的作用。特别是在工业、科研等领域&#xff0c;对于数据的快速准确获取、处理和分析需求日益增加。LabVIEW作为一种图形化编程语言&#xff0c;以其直观、高效的特点&#xff0c;在自…

【数据分析】这些年我发过的微信朋友圈

TencentRecordAnalysisV1.0.3.zip 蓝奏云&#xff1a;链接:链接TencentRecordAnalysis (lanzoub.com)密码:9hww 朋友圈还是以本行业岩土、工作相关的内容居多。 对于一个不怎么发圈的人来说&#xff0c;这几天有点反常&#xff0c;这几天大概是我成功的开发了几个失败的GPT应用…

打造亚马逊爆款秘诀:流量、排名与自养号测评的完美结合

亚马逊是一个产品为王的平台&#xff0c;只要我们的产品好&#xff0c;就会有更多的流量&#xff0c;有流量还怕我们的产品卖不出去&#xff1f;身为新手我们店无流量该怎么办&#xff0c;今天教给你们五个获取流量的方法。 1.自然检索 那是我们常说的自然流量&#xff0c;通…

DBCHM 数据库 CHM 文档生成工具

介绍 DBCHM 是一款数据库文档生成工具&#xff01; 该工具从最初支持chm文档格式开始&#xff0c;通过开源&#xff0c;集思广益&#xff0c;不断改进&#xff0c;又陆续支持word、excel、pdf、html、xml、markdown等文档格式的导出。 支持的数据库 SqlServerMySQLOraclePos…

拥抱新质生产力,助力新型工业化!CMM电子展暨IARS机器人展5月东莞盛大起航

2024年5月15-17日&#xff0c;东浩兰生会展集团旗下CMM电子展&#xff06;IARS机器人展将在广东现代国际展览中心&#xff08;东莞厚街&#xff09;举办。展会面积达50000平方米&#xff0c;展示品牌700余个&#xff0c;同期论坛峰会30余场&#xff0c;预计专业观众超50000人次…

肆拾玖坊商业模式分析,新品牌如何采用合伙人模式起盘

坐标&#xff1a;厦门&#xff0c;我是易创客运营肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 比茅台盈利模式还牛逼的肆拾玖坊&#xff0c;所有男人都逃不出它的圈套&#xff01;只靠49个男人&#xff0c;用一套…

软考信息系统项目管理师论文突然单独考,其实影响没有想象的大

五一假期的前一天&#xff0c;辽宁省软考办发布了一则通知&#xff0c;安排了辽宁省的软考批次安排&#xff0c;从标题看不出来有用的信息&#xff0c;但是干货是埋在正文中的。我先把辽宁软考办的全文给你附上如下&#xff0c;具体的解读后面我会一一道来。 敲重点来了&#x…

笔记13-OSError: [Errno 24] Too many open files

文章目录 参考文献失败尝试系列查看发现&#xff0c;似乎是因为线程数有限制 修改配置先查查看 增加文件数限制&#xff0c;然后使用命令运行&#xff08;成功&#xff09; 参考文献 Linux 最大可以打开多少文件描述符&#xff1f; OSError: [Errno 24] Too many open files错…

解决在C#中方向键对控件焦点的控制

不要犹豫直接把下面这个程序复制进去就好了&#xff0c;不用担心0个引用&#xff0c;哈哈&#xff0c;可以的 public partial class MainForm : Form {public MainForm(){InitializeComponent();}protected override bool ProcessDialogKey(Keys keyData){// 检查是否是方向键…

基于springboot实现实习管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现实习管理系统演示 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定实习管理系统…

【PX4-AutoPilot教程-TIPS】Matlab使用ROS Toolbox编译MAVROS2消息报错缺少geographic_msgs消息

Matlab使用ROS Toolbox编译MAVROS2消息报错缺少geographic_msgs消息的解决方法 问题描述解决方法 环境&#xff1a; MATLAB : R2022b ROS Toolbox : 1.6 Windows &#xff1a;Windows 10 22H2 ROS &#xff1a;ROS2 Foxy 问题描述 在使用Matlab的ROS Toolbox工具箱编译与…

JAVA基础之Swing窗体的几种布局

1、边框布局BorderLayout 特点&#xff1a;5个方位&#xff08;东&#xff08;East&#xff09;南&#xff08;north&#xff09;西(west)北(south)中(center)&#xff09; 是一种简单的布局策略。 使用时&#xff0c;应将其看成一个“组件”。 同样&#xff0c;首先应通…

VMware worksation 17 简易安装Centos8.2、Redhat8.2、Ubuntu16.04

系列文章目录 文章目录 系列文章目录前言一、VMware worksation 17 安装二、安装Centos8.2三、安装RHEL8.2四、安装Ubuntu16.04总结 前言 傻瓜式按照Linux系统&#xff0c;如果觉得简单&#xff0c;可以自定义设置&#xff0c;特别是配置一下磁盘空间大小&#xff0c;对以后排…

通过DataGrip将mysql表结构信息转存excel 复制select结果的insert插入语句

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的专栏 总结 | 提效 | 拓展&#xff0c;在这个系列专栏中记录了博主在学习期间总结的大块知识点&#xff0c;以及日常工作中遇到的各种技术点 ┗|&#xff40;O′|┛ &#x1f306; 内容速览 1 查询表结构信息&#xff0c;并…

我希望未来10年,人工智能可以帮我解决这4件小事

生活在一线大城市的我&#xff0c;现在几乎整天被大数据、人工智能、机器学习、智慧生活的词汇环绕立体包围着&#xff0c;让我时刻感觉到&#xff0c;再过10年&#xff0c;我们五一假期真的可以摆脱现在擦肩接踵的旅游盛况了。但我其实要求倒是没这么高&#xff0c;我真心希望…

AnaTraf 网络流量分析仪 - 网络性能检测与诊断(NPMD)

目录 网络流量回溯分析,快速定位故障 实时监控,洞察网络运行状况 性能分析,优化网络应用 即插即用,无需复杂配置 了解更多 近年来&#xff0c;随着互联网技术的不断发展,网络已经成为企业运营的基础设施。然而,复杂多变的网络环境也给企业的网络管理带来了新的挑战。如何快…

一部手机就能实现24小时AI实景自动无人直播:商业推广拓客进击的全新推广利器

随着科技的迅猛发展&#xff0c;AI实景自动无人直播软件正逐渐成为商家拓展业务的重要工具。其智能讲解、一键开播以及智能回复功能&#xff0c;使得商家能够高效地进行推广活动&#xff0c;而手机拍摄真实场景和自行搭建场景的灵活性&#xff0c;则赋予了直播画面更好的呈现效…
最新文章