当前位置: 首页 > article >正文

c++ map和vector模板类

在这一章中C++语法之模板函数和模板类-CSDN博客

我们学习了怎样写模板函数和模板类,接下来我们来学习系统给我们写好的两个模板类:map和vector。

我相信有了上文的基础,能帮助我们更好的理解这些模板类。

map和vector 是C++ STL(标准模板库) 中的一部分,基于模板技术实现的类。

map是一种键值对管理的类,想象一下,如果你需要管理类似的数据:

姓名和年龄:zhengyong------21

或者姓名和ID,账号和密码。

按普通的方法,我们怎么处理。

定义两个数组?比如:

#include <iostream>using namespace std;int main() {char name[100][10] = { {"zhengyong"},{"zhangsan"}};int age[100] = { 21,33 };for (int i = 0; i < 2; i++)cout << "name:" << name[i] << "\tage:" << age[i] << endl;}

结果:

 

这样通过下标名的方式对应关联。好像是实现了功能,但这样的代码只实现很小的一部分,未来将会有很多问题。

比如如何动态的分配数组的大小,我的键值对数量不是固定的。

而且这种关联性较弱。

当然以上两个问题,你都会想到解决方法,比如数组的定义用指针的方法,new来分配。

第二个是定义一个类,类中有成员变量name 和age。

是解决了一部分问题,但是这样做,还是显得比较麻烦,如果以后还需要对数据的增删改查呢?

你需要花费很多的时间来处理这些东西。

这种手动维护的方式,非常的不方便。也较易出错。 

那么在这里我推荐使用map模板类,来处理这些。它将是你非常好的帮手。

map使用方法:

#include <iostream>
#include <map>
using namespace std;int main() {map<const char*, int> myMap;myMap["zhengyong"] = 21;myMap["zhangsan"] = 33;cout << myMap["zhengyong"] << endl;}

输出21:

map类中的<>,用来定义键值对的类型。 

然后关联就是在[]里代表的是键,值就是在等号右边,如myMap["zhengyong"] = 21;

这样就会很方便的关联,取值,以及其它操作等。

但是上面这种用法有危险,为什么,因为你的键是指针类型的,它关联的是指针地址,并不是它指向的字符串,那么你的后续的增删改查都是通过地址值来实现了,这违背了我们预想的键值对的初衷,如zhengyong 字符串关联的是21.

但为什么我输出又正常呢?这是因为编译器把这个常量字符串用的同一个地址。

所以现在看似正常,在某些情况下就会出错。比如如下代码:

#include <iostream>
#include <map>
using namespace std;int main() {map<const char*, int> myMap;myMap["zhengyong"] = 21;myMap["zhangsan"] = 33;const char* cp = "zhengyong";char c[10] = "zhengyong";const char* cp2 = c;cout << myMap[cp] << endl;cout << myMap[cp2] << endl;}

结果:

可以看到,cp指针指向的常量字符串"zhengyong",都是同一个地址,所以输出没问题。

我们接着用数组接收字符串,在栈中分配地址。

然后cp2指针指向它,虽然都是同一个字符串,但是第二个输出的却是0.

所以可以判断这里是根据地址内容生成的键的。

这里另一个需要注意的点是,当你使用了myMap["other"],其它键名之前没有的。

这里默认就会在myMap创建一个这样的键,默认值为0.

所以以后为了避免这种情况,我们可以使用at方式,at后面跟键名取值,如下:
myMap.at(cp) 这样如果没有这个键,它不会创建,而是会报错。

那么用指针这个方式表达字符串会造成一些麻烦,我们应该怎么解决呢?

推荐使用字符串类string,就没有这些问题了。它是根据字符串来处理的。键值对,是绑定字符串的。

如下示例:

#include <iostream>
#include <map>
#include<string>
using namespace std;int main() {map<string, int> myMap;  //直接用string类型myMap["zhengyong"] = 21;myMap["zhangsan"] = 33;cout << myMap["zhengyong"] << endl;}

ok,上面的用法是正常的。

前面说了访问键值推荐用at方法,那么创建键值对的时候也是有一点要说明的。

myMap["zhengyong"] = 21;  如果是这样创建,会覆盖掉原来的键(如果有)。

如果不想覆盖,可以用insert或者emplace成员函数创建。

 myMap.insert({ "zhengyong", 21 }); // 如果键已存在,则忽略myMap.emplace("zhengyong",21);

或者我们可以自己编写一下逻辑,用find查找一个键名是否存在,如果不存在则创建:

if (myMap.find("zhengyong") == myMap.end()) {myMap["zhengyong"] = 21; // 仅在键不存在时插入
}

好了,以上就是map大概的用法,更多的细节,比如map类的其它成员函数,大家可自行查找,这里就不过多的介绍了。

vector模板类

vector可以看作是一个动态数组处理类。

像我们之前,常规的一维数组,比如int a[10],要实现动态分配大小,或者增加删除元素。

很麻烦。所以vector就自然的出现了。

我们使用vector来定义数组,如下:

 vector<int> vc; //定义int 数组。

尖括号里面int表示 定义int类型的数组。

此时vc里面是没有元素的,是空的。我们可以用emplace_back来添加元素

完整示例:

#include <iostream>
#include<vector>
using namespace std;int main() {vector<int> vc; //定义int 数组。vc.emplace_back(11);vc.emplace_back(22);vc.emplace_back(100);//添加三个元素。//接着访问输出for (int i = 0; i < vc.size(); i++)cout << vc[i] << endl;//删除第二个元素vc.erase(vc.begin()+1); //erase需要指向元素的迭代器作为参数,vc.begin可以获取第一个元素的迭代器,然后加上1,就是第二个了//再输出看一下效果cout << "删除了第二个元素的vc数组" << endl;for (int i = 0; i < vc.size(); i++)cout << vc[i] << endl;}

效果:

 

注意这里不能用vc[0]=11这样来添加元素,因为此时vc里是没有元素的vc[0]没有添加的功能,所以为空。只有当vc[0]创建了之后,才可以vc[0]=11(修改元素的值)

另:我们也可在定义时初始化赋值:

vector<int> vc = { 11,22,100 };

也可以预先分配数组大小如:

vector<int> vc(3);//创建三个元素的数组

这样就可以用vc[0]=11直接赋值了。 

上面是一维数组的使用方法,如果是二维数组呢?

我们需要嵌套使用,比如定义一个vc一维数组,然后vc里的每个元素又是一个vector。

示例:


#include <iostream>
#include<vector>
using namespace std;int main() {vector<vector<int>> vvc;  //vector<>里的类型还是vector//我们先创建一个一维vectorvector<int> vc = { 1,2,3 };//再来一个vector<int> vc1 = { 2,8,8 };//然后将这两个添加到vvc里去,这样就是个二维数组了。vvc.emplace_back(vc);vvc.emplace_back(vc1);for (int i = 0; i < vvc.size(); i++){for (int j = 0; j < vvc[i].size(); j++)cout << vvc[i][j] << "\t";cout << endl;}}

效果:

总结:可以看到,我们之前如果用普通数组来处理字符串,管理键值对类的数据,以及对数组的增删改查极为不便,现在把map vector string 这些加入到C++后,对我们写程序会方便很多。

相关文章:

c++ map和vector模板类

在这一章中C语法之模板函数和模板类-CSDN博客 我们学习了怎样写模板函数和模板类&#xff0c;接下来我们来学习系统给我们写好的两个模板类:map和vector。 我相信有了上文的基础&#xff0c;能帮助我们更好的理解这些模板类。 map和vector 是C STL(标准模板库) 中的一部分&a…...

hn航空app hnairSign unidbg 整合Springboot

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 学习unidbg补环境。先弄一个…...

Arm Linux ceres库编译

由于工作需要&#xff0c;需在国产化系统上编译ceres库&#xff0c;手上有一块树莓派&#xff0c;就在树莓派上面进行测试编译ceres库&#xff0c;总体来说比较顺利。只出现了一点小问题 参考链接&#xff1a; Ceres中文教程-安装 Ceres官方网站&#xff08;英文&#xff09; …...

c++中的四种cast转换

文章目录 前言一、dynamic_cast二、static_cast三、const_cast四、reinterpret_cast总结 前言 C继承并扩展C语言的传统类型转换方式&#xff0c;提供了功能更加强大的转型机制&#xff08;检查与风险&#xff09; 转换类型典型用途安全性static_cast相关类型转换&#xff08;…...

矩阵补充,最近邻查找

矩阵补充&#xff0c;最近邻查找 矩阵补充是向量召回最简单的一种方法&#xff0c;现在不常用&#xff0c;学习矩阵补充是为了更好的理解后面学到的双塔模型 下图&#xff0c;输入用户ID和物品ID后从Eebedding层拿到对应的向量做内积&#xff0c;内积的结果就是矩阵补充 模型…...

gradio调用多个CSS的HTML页

很多博客介绍的gradio读取html和css比较简单&#xff0c;如果要做很细致的前端页面优化&#xff0c;比如丰富的响应式的cssjs&#xff0c;至少要有html多个css&#xff0c;是暂不能实现的。bootstrap、font-awesome、jquery等 方案一当然是直接更换htmlcss为主的部署方式&#…...

NVIDIA NeMo 全面教程:从入门到精通

NVIDIA NeMo 全面教程&#xff1a;从入门到精通 文章目录 NVIDIA NeMo 全面教程&#xff1a;从入门到精通目录框架介绍NeMo的核心特点NeMo的架构NeMo与其他框架的比较NeMo的模型集合NeMo的工作流程NeMo 2.0的新特性 安装指南系统要求使用Docker容器安装步骤1&#xff1a;安装Do…...

Go 语言封装邮件发送功能

Go 语言封装邮件发送功能 &#x1f3c6; 目标&#x1f4e6; 依赖包&#x1f31f; 项目结构&#x1f680; 代码实现&#x1f6e0;️ 主要方法说明&#x1f9ea; 单元测试&#x1f308; 使用示例&#x1f3c6; 代码亮点&#x1f31f; 改进方向&#x1f680; 总结 在现代 Web 开发…...

加新题了,MySQL 8.0 OCP 认证考试 题库更新

MySQL 8.0 OCP 认证考试 题库更新 MySQL 8.0 Database Administrator 考试科目&#xff1a;1Z0-908 近期发现&#xff0c;MySQL OCP认证考试题库发生变化&#xff0c;出现了很多新题&#xff0c;对此&#xff0c;CUUG专门收集整理了最新版本的MySQL考试原题&#xff0c;并会给…...

Thales靶机攻略

1.下载导入VBox&#xff0c;并启动靶机 靶机地址&#xff1a;https://download.vulnhub.com/thales/Thales.zip 解压后&#xff0c;在VBox中导入虚拟电脑。包含所有网卡的MAC地址。 导入完成&#xff0c;设置网卡模式为仅主机网络。开启靶机。 kali网卡更改为桥接模式。点击工…...

尝试使用Tauri2+Django+React项目(2)

前言 尝试使用tauri2DjangoReact的项目-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146403103在前面笔者不知道怎么做&#xff0c;搞了半天 笔者看到官网&#xff0c;原来可以使用二进制文件&#xff0c;好好好 嵌入外部二进制文件 | Taurihttps://v2.taur…...

6.1 模拟专题:LeetCode 1576. 替换所有的问号

1. 题目链接 LeetCode 1576. 替换所有的问号 2. 题目描述 给定一个仅包含小写字母和问号 ? 的字符串 s&#xff0c;要求将所有 ? 替换为任意小写字母&#xff0c;使得替换后的字符串中 没有相邻的两个字符相同。 示例&#xff1a; 输入&#xff1a;s "?zs" →…...

Linux安装go环境

安装一个lazydocker&#xff0c;根据文档需要先安装go环境 https://github.com/jesseduffield/lazydocker 官方文档解析 https://go.dev/doc/install 文档内容如下&#xff0c;一共三步 1.删除先前安装的go&#xff0c;解压下载的go压缩包到/usr/local目录 2.添加环境变量&…...

卡特兰数在数据结构上面的运用

原理 Catalan数是一个数列&#xff0c;其第n项表示n个不同结点可以构成的二叉排序树的数量。Catalan数的第n项公式为&#xff1a; &#xfffc; 其中&#xff0c;&#xfffc;是组合数&#xff0c;表示从2n个元素中选择n个元素的组合数。 Catalan数的原理可以通过以下方式理解&…...

Unity知识点快速回顾系列

Unity知识点快速回顾系列导航 主要想用于快速回顾unity相关知识点&#xff0c;基本只讲解知识点&#xff0c;只有简单的示例&#xff0c;目前还在整理中。 一、C#知识点入门、基础、核心、进阶 二、Unity 知识点入门、基础、核心、进阶 三、Unity 数据持久化 四、Unity 知识点快…...

悟空crm v12安装好后出现 网络错误问题(已解决)

请求网址: http://wwww.aaaa.com/gateway/adminUser/queryUserNumInfo 请求方法: POST 状态代码: 502 Bad Gateway 远程地址: 101.37.79.226:9807 引荐来源网址政策: strict-origin-when-cross-origin...

便携版:随时随地,高效处理 PDF 文件

PDF-XChange Editor Plus 便携版是一款功能强大且极其实用的 PDF 阅读与编辑工具。它不仅支持快速浏览 PDF 文件&#xff0c;还提供了丰富的编辑功能&#xff0c;让用户可以轻松处理 PDF 文档。经过大神优化处理&#xff0c;这款软件已经变得十分轻便&#xff0c;非常适合需要随…...

【Golang】补充:占位符、转义字符、错误处理

&#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;Golang &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 1、占位符 1.1通用占位符 %v &#xff1a;默认格式的值。适…...

文件上传绕过的小点总结(4)

9.末尾点删除处理缺陷 给出源码&#xff1a; $file_name trim($_FILES[upload_file][name]); $file_name deldot($file_name);//删除文件名末尾的点 $file_ext strrchr($file_name, .); $file_ext strtolower($file_ext); //转换为小写 $file_ext str_ireplace(::$DATA,…...

AI比人脑更强,因为被植入思维模型【23】损失规避思维模型

我觉得这是一个很有趣的思维模型。 我们学习一个思维模型&#xff0c;不光是指导自己的思维&#xff0c;其实也可以预测或者思考别人的思维模型&#xff0c;也就是别人会怎么想&#xff0c;怎么做&#xff1f; 定义 三层解释思维模型是一种深入剖析事物本质的思考框架&#x…...

如何用Spring AI构建MCP Client-Server架构

现代 Web 应用正加速与大语言模型(LLMs)深度融合,构建超越传统问答场景的智能解决方案。为突破模型知识边界,增强上下文理解能力,开发者普遍采用多源数据集成策略,将 LLM 与搜索引擎、数据库、文件系统等外部资源互联。然而,异构数据源的协议差异与格式壁垒,往往导致集…...

如何让WordPress不同的页面、栏目显示不同的小工具侧边栏

WooSidebars 是一款用于 WordPress 的插件,主要功能是允许用户根据不同的上下文条件(如特定页面、博客文章、分类目录或搜索结果页面等)来更改侧边栏中显示的小工具。 自定义小工具区域:用户可以轻松创建自定义的小工具区域,并将其设置为在多种条件下显示,只需点击几次即…...

智慧座椅的节能效果如何?

嘿呀&#xff0c;你知道不&#xff0c;咱这叁仟智慧座椅的节能效果&#xff0c;那可是像个神秘小宇宙&#xff0c;根据不同的技术和应用场景&#xff0c;会展现出超有趣的变化哦&#xff0c;下面就给你唠唠常见的几种情况哈&#xff01; 能源回收大变身&#xff1a;有些叁仟智…...

Matlab:二维绘图篇——不同坐标系下的绘图命令

目录 1.极坐标系下绘图&#xff1a;polar命令 实例——极坐标图形 实例——直角坐标与极坐标系图形 2.半对数坐标系下绘图&#xff1a;semilogx和semilogy 实例——半对数坐标系图形 3.双对数坐标系下绘图&#xff1a;loglog 实例——双对数坐标系绘图 4.双y轴坐标&…...

HTTP 协议中请求与响应的详细解析

前言&#xff1a;HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是用于在互联网上传输超文本的协议 --由一个请求和响应组成&#xff0c;一个完整的 HTTP 请求由请求行&#xff08;Request Line&#xff09;、请求头&#xff08;Headers&…...

对三维物体模型的阈值操作

对三维物体模型的阈值操作 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头2. point_normal_x、point_normal_y、point_normal_z有什么区别&#xff1f;3. 去除离群点 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头 dev_open_win…...

prometheus 添加alertmanager添加dingtalk机器人告警

1、dingtalk创建机器人,目前我们采用加白名单的方式校验 2、定位到如下图 test结果如下...

一些题目记录

别人面经题目记录 https://zhuanlan.zhihu.com/p/32626732052 实现 NMS&#xff0c;七八次&#xff0c;很高频&#xff1b; 实现 MultiHeadSelfAttention&#xff0c;大概 三四次&#xff1b; 用 Numpy 或者 List 实现MLP 的前向和反向&#xff0c;4次&#xff1b; Leetcode …...

向量数据库学习笔记(1) —— 基础概念

一、 嵌入模型 Embedding Models 嵌入模型是将复杂数据&#xff08;如文本、图像、音频等&#xff09;转换为向量表示的机器学习模型 1. 核心概念 嵌入(Embedding)&#xff1a;将高维、非结构化的数据映射到低维、稠密的向量空间 向量表示&#xff1a;输出固定长度的数值向量…...

Python学习第二十五天

Scrapy框架 官网概念 Scrapy 是一个强大的 Python 网络爬虫框架。 最新版本学习 安装 pip install scrapy 使用 # 创建名称为myscrapy的爬虫项目 scrapy starpoject myscrapy # 创建爬那个 就是比如 需要爬http://quotes.toscrape.com 运行的名称&#xff1a;toscrape运行…...