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

【C++】map和multimap的常用接口详解

        map和multimap的文档:<map> - C++ Reference

1.map类的介绍

map 有两个模板参数,是 key/value的场景。

  • 这里的Key就是key,T就是value,命名不同而已。
  • map默认要求Key⽀持⼩于⽐较(升序),如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数,map底层存储数据的内存是从空间配置器申请的。⼀般情况下,我们都不需要传后两个模版参数。
  • map底层是⽤红⿊树实现,增删查改效率是 O(logN) ,迭代器遍历是⾛的中序,所以是按key有序顺序遍历的,不是按value。

我们打开map的文档介绍会发现和set的一些接口大差不差,但值得注意的是,map的value_type不同于set了。

所以在介绍map的接口之前我们先说一下这个value_type。

2.pair类型介绍

从文档我们可以看到,这里的value_type是一个叫pair的东西。

 和set对比一下。

set的 key_type 和 value_type是一样的,就是key,map的key_type是key,value_type是pair

 map底层的红⿊树节点中的数据,使⽤pair<Key, T>存储键值对数据。我们来看一下这个pair。在文档就能查到。

pair是函数模板,有两个模板参数,里面有两个成员,first和second。

first就是T1,second就是T2。pair的底层实现这里有一份,感兴趣可以看一下。

typedef pair<const Key, T> value_type;
template <class T1, class T2>
struct pair
{typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair() : first(T1()), second(T2()){}pair(const T1& a, const T2& b) : first(a), second(b){}template<class U, class V>pair(const pair<U, V>& pr) : first(pr.first), second(pr.second){}
};
template <class T1, class T2>
inline pair<T1, T2> make_pair(T1 x, T2 y)
{return (pair<T1, T2>(x, y));
}

 简单来说就是我们的key传过去就是pair里的first,传的value就是这里的second。

在【C++】二叉搜索树(搜索二叉树) 这篇博客中,我们自己实现key/value场景的时候,要分别传key和value,两个模板参数是分开的。拿insert来举例。

有了pair就可以理解为,原本分开的key和value“捆绑”在一起了,多封了一层。

3.map增删查改

前面提到了insert那就从insert开始介绍吧。

3.1 insert增 和 改

这就是插入一个pair,插入pair有三种方法。

map<string, string> m;//插入有名对象
pair<string, string> word1("hello", "你好");
m.insert(word1); 
//插入匿名对象
m.insert(pair<string, string>("eat", "吃"));
//调用make_pair
m.insert(make_pair("bad", "坏的"));

前两种都比较好理解,来看第三个,调用make_pair函数模板,这个函数在文档里可以找到。

make_pair这个函数模板大概就长这样,就是因为pair写起来要写模板参数,像前面两种写法,比较多比较长,就有了这个函数模板。传两个值给make_pair,然后这个模板推导对应的类型,返回一个pair对象。

还有就是用大括号括起来,这里走的是隐式类型转换,C++11之后支持多参数的转换,如下。

m.insert( { "cat", "猫" } );

 这4种方式都可以,用的最多的还是花括号的写法。

insert的返回值

insert的返回值也是pair,这里就出现两个pair,一个是前面说过的,pair存的是key/value,insert的返回值的pair存的是一个迭代器和bool值,因为insert可能插入成功,也可能失败。

并且注意这句话,这个first这个迭代器要么指向新插入的元素,要么是指向和key相等的元素。

总结一下就是:

  • 插入成功,就返回 pair<新插入值所在迭代器,true> 
  • 插入失败,就返回pair<已经存在的和key相等的值所在迭代器,false>

这也意味着,insert不仅可以插入数据,还能查找数据。这是为了operator[]做准备。

列表插⼊,已经在容器中存在的值不会插⼊ 。

如果要同时插入多组值,也是可以用花括号,插入列表值。

m.insert({{"hello", "你好"},  {"eat", "吃"}, {"bad", "坏的"}, {"cat", "猫"}});

我们可以把插入的这些值打印出来。但是这里的迭代器不同以前。

C++不支持两个值同时返回,并且pair没有支持流插入和流提取,所以下面的写法是错误的。

auto it = m.begin();
while (it != m.end())
{cout << *it << endl; //错误写法it++;
}
cout << endl;

最简单的写法如下。

cout << it->first << ":" << it->second << endl;

 顺序是按key比较的,字符串就是按ASCII码比。

我们也可以通过 . 来取pair里的数据,但是->用的还是最多的。

cout << (*it).first << ":" << (*it).second << endl;

假如说我现在要插入key相同但是value不同的值,如下。

m.insert({"cat", "猫"}); //原来的
m.insert({ "cat", "猫科动物"}); //新插入的

key相等但是value不相等,会不会更新这个value?

 是不会把旧的覆盖掉的。插入的时候只看key是否相等,不看value,而map不允许冗余,multimap才允许冗余,这里相当于插入失败了。

虽然key不支持修改,但是这里的value是支持修改的。

auto it = m.begin();
while (it != m.end())
{//it->first += 'z'; //不可修改it->second += 'z';//可修改cout << it->first << ":" << it->second << endl;it++;
}
cout << endl;

3.2 erase

删除有三个版本:删除⼀个迭代器位置的值;删除k,k存在返回0,存在返回1;删除⼀段迭代器区间的值。 删除和插入一样,只与key有关,和value没关系。

map<string, string> m = { {"hello", "你好"},  {"eat", "吃"},{"bad", "坏的"}, {"cat", "猫"} };
auto it = m.begin();
while (it != m.end())
{cout << it->first << ":" << it->second << endl;it++;
}
cout << endl;

 给值删除

m.erase("cat"); 
it = m.begin();
while (it != m.end())
{cout << it->first << ":" << it->second << endl;it++;
}

 给迭代器删除。

m.erase(m.begin()); 
it = m.begin();
while (it != m.end())
{cout << it->first << ":" << it->second << endl;it++;
}

3.3 其他常用接口

以下四个接口,在set详细介绍过,且与set的这些接口用法差不多,不了解的可移步至:【C++】set和multiset的常用接口详解

查找k,返回k所在的迭代器,没有找到返回end() 。

查找k,返回k的个数。

返回⼤于等于k位置的迭代器 。

返回⼤于k位置的迭代器 。

equal_range这个接口在set中没做介绍,因为它的返回值是pair。

 就是把与k相等的的左闭右开区间返回,这主要是用在multimap的,因为multimap存在多个相同的key。

4.map的迭代器和[]功能

先把我们在搜索二叉树的一个统计水果出现次数的例子拿过来。

int main()
{string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜","苹果", "香蕉", "苹果", "香蕉" };map<string, int> countMap;for (const auto& str : arr){auto ret = countMap.find(str);if (ret == countMap.end()){countMap.insert({ str, 1 });}else{ret->second++;}}for (const auto& e : countMap){cout << e.first << ":" << e.second << endl;}return 0;
}

利⽤find和iterator修改功能,统计水果出现的次数。

先查找⽔果在不在map中:

  • 不在,说明⽔果第⼀次出现,则插⼊{⽔果, 1}
  • 在,则查找到的节点中⽔果对应的次数,然后++

但是有了[ ],就只需要一句话搞定。

for (const auto& str : arr)
{countMap[str]++; //用[]
}

 

 来看这个operator[]。

简单来说,就是给一个map的first,也就是key,返回他的second,也就是value。 这个operator[]同时具有插入,查找,修改的功能。在文档里写了这个operator[]的底层。

可以理解为[]就是调用上面这个东西,也能说明operator[]底层是用insert实现的。 仔细看前面说到的insert的返回值,insert插⼊失败时充当了查找的功能,正是因为这⼀点,insert可以⽤来实现operator[]。

上面的那句代码比较复杂,这里展开后,如下。

// operator的内部实现
mapped_type& operator[] (const key_type& k)
{pair<iterator, bool> ret = insert({ k, mapped_type() });iterator it = ret.first;return it->second;
}
  1. 如果k不在map中,insert会插⼊k和mapped_type默认值(可以是相应类型的默认构造),同时[]返回结点中存mapped_type值的引⽤,那么我们可以通过引⽤修改返映射值。所以[]具备了插⼊+修改功能。
  2. 如果k在map中,insert会插⼊失败,但是insert返回pair对象的first是指向key结点的迭代器,返回值同时[]返回结点中存储mapped_type值的引⽤,所以[]具备了查找+修改的功能。

结合上面的代码,接可以理解operator[]是怎么用的了。

比如说第一次插入西瓜,西瓜没出现过,会插入成功。此时insert会插⼊k和mapped_type默认值 ,mapped_type是int,int默认值是0。

插入成功,就返回 pair<新插入值所在迭代器,true> 

  ret的first是西瓜的迭代器,ret的second是这个bool值,所以这句话是把西瓜的迭代器取出来。

此时 it 就是西瓜的迭代器,it的first是string,就是这个“西瓜”,就是key,it的second是int,就是value。返回的就是这个it的second。返回的这个second再++。

countMap[str]++;

再举一个插入失败的例子。

比如说第2次插入苹果的时候,会插入失败,因为苹果已经存在过了,此时的mapped_type是1。

插入失败时,返回的就是 pair<已经存在的和key相等的值所在迭代器,false> ,所以这里会返回苹果的迭代器,false。

ret的first是苹果的迭代器,ret的second是这个bool值,所以这句话是把苹果的迭代器取出来。

 返回值是it的second,it就是苹果的迭代器,苹果的first是string,就是这个“苹果”,就是key,苹果的second是int,就是value。返回的这个second再++。

countMap[str]++;

所以这句话就是当str不存在时,充当插入+修改的功能,当str存在时,充当查找+修改的功能。

方括号的几个功能我们再说一下。

map<string, string> mymap;
mymap.insert({ "hello", "你好" });//key不存在 -> 插入
mymap["cat"]; 

 当key不存在的时候,并且不进行修改动作,只是插入,用[]的话会直接插入。

并且新插入的这个key所对应的value是空串,因为string的默认构造就是空串 。

map<string, string> mymap;
mymap.insert({ "hello", "你好" });//key不存在 -> 插入
mymap["cat"]; //key不存在 -> 插入+修改
mymap["right"] = "右边";

当key不存在的时候,并且进行修改动作,这个[]的功能就是插入+修改。

新插入的这个key所对应的value就是修改的那个值。

map<string, string> mymap;
mymap.insert({ "hello", "你好" });//key不存在 -> 插入
mymap["cat"]; //key不存在 -> 插入+修改
mymap["right"] = "右边";//key存在 -> 修改
mymap["right"] = "正确的";

当key存在的时候,并且进行修改动作,这个[]的功能就是修改。

此时的key所对应的value就是修改后的那个值。 

[]可以用来查找。

//查找不存在的key
cout << mymap["left"] << endl;
//查找存在的key
cout << mymap["right"] << endl;

当我们查找存在的key时,打印相应的value,但是查找不存咋的key时,打印的是空串。因为这个key不存在,就会把key插入。

所以用[]来查找的话要谨慎,一不小心就误操作了,一般不建议用[]来查找

5. map和multimap的区别

multimap和map的使⽤基本完全类似,主要区别点在于multimap⽀持关键值key冗余,那么
insert/find/count/erase都围绕着⽀持关键值key冗余有所差异,这⾥跟set和multiset完全⼀样,⽐如insert的时候,重复的值 都能插入; find时,有多个key,返回 中序第⼀个; 删除key的话是 删除所有的key; 其次就是multimap 不⽀持[] ,因为⽀持key冗余,[]就只能⽀持插⼊了,不能⽀持修改。

equal_range这个接口在multimap里就比较好用了。

int main()
{multimap<char, int> mymm;mymm.insert(pair<char, int>('a', 10));mymm.insert(pair<char, int>('b', 20));mymm.insert(pair<char, int>('b', 30));mymm.insert(pair<char, int>('b', 40));mymm.insert(pair<char, int>('c', 50));mymm.insert(pair<char, int>('c', 60));mymm.insert(pair<char, int>('d', 60));cout << "mymm contains:" << endl;for (char ch = 'a'; ch <= 'd'; ch++){pair <multimap<char, int>::iterator, multimap<char, int>::iterator> ret;ret = mymm.equal_range(ch);cout << ch << " =>";for (multimap<char, int>::iterator it = ret.first; it != ret.second; ++it)cout << ' ' << it->second;cout << endl;}return 0;
}

给equal_range传一个key过去,equal_range返回与key相等的左开右闭迭代器区间

本次分享就到这里了,我们下篇见~

相关文章:

【C++】map和multimap的常用接口详解

map和multimap的文档&#xff1a;<map> - C Reference 1.map类的介绍 map 有两个模板参数&#xff0c;是 key/value的场景。 这里的Key就是key&#xff0c;T就是value&#xff0c;命名不同而已。map默认要求Key⽀持⼩于⽐较&#xff08;升序&#xff09;&#xff0c;如…...

线程池模式与C#中用法

一、线程池模式解析 1. 核心概念 线程池是一种 管理线程生命周期的技术&#xff0c;主要解决以下问题&#xff1a; 减少线程创建/销毁开销&#xff1a;复用已存在的线程 控制并发度&#xff1a;避免无限制创建线程导致资源耗尽 任务队列&#xff1a;有序处理异步请求 2. …...

47、C#可否对内存进⾏直接的操作?

是的&#xff0c;C# 可以通过几种方式对内存进行直接操作&#xff0c;尽管它主要是一门托管语言&#xff0c;内存管理通常由.NET运行时自动处理。 主要方法 1.unsafe 代码和指针 使用 unsafe 关键字可以启用指针操作需要项目启用"允许不安全代码"选项示例&#xf…...

精益数据分析(70/126):MVP迭代中的数据驱动决策与功能取舍

精益数据分析&#xff08;70/126&#xff09;&#xff1a;MVP迭代中的数据驱动决策与功能取舍 在创业过程中&#xff0c;最小可行化产品&#xff08;MVP&#xff09;的迭代优化是从验证假设到实现产品市场契合的关键环节。今天&#xff0c;我们结合《精益数据分析》中的方法论…...

大数据与数据库服务器参数调优方法

1 硬件配置优化 ‌存储与磁盘‌ 优先选择 ‌SSD固态硬盘‌替代机械硬盘,显著降低I/O延迟,提升随机读写性能。 采用 ‌RAID 10阵列‌实现高性能与冗余的平衡,适用于高并发数据库场景。 大数据场景中,通过‌多磁盘并行挂载‌(如HDFS)提升吞吐量,规避单盘性能瓶颈。 ‌I/…...

【Fifty Project - D28】

今日完成记录 TimePlan完成情况9&#xff1a;30 - 11&#xff1a;30Leetcode√14&#xff1a;00 - 15&#xff1a;30练胸√15&#xff1a;30 - 16&#xff1a;30Leetcode√19&#xff1a;40 - 21&#xff1a;20有氧√ Leetcode 今天是周赛复盘篇&#xff0c;昨天的周赛太刺激…...

Image and depth from a conventional camera with a coded aperture论文阅读

Image and depth from a conventional camera with a coded aperture 1. 研究目标与实际意义1.1 研究目标1.2 实际问题与产业意义2. 创新方法:编码光圈设计与统计模型2.1 核心思路2.2 关键公式与模型架构2.2.1 图像形成模型2.2.2 深度可区分性准则2.2.3 统计模型与优化框架2.2…...

vue3 vite 项目中自动导入图片

vue3 vite 项目中自动导入图片 安装插件配置插件使用方法 安装插件 yarn add vite-plugin-vue-images -D 或者 npm install vite-plugin-vue-images -D配置插件 在 vite.config.js 文件中配置插件 // 引入 import ViteImages from vite-plugin-vue-images;plugins: [vue(),/…...

软考-软件工程开发模型

软考-软件工程开发模型 参考视频&#xff1a; 软件工程概述&开发模型 &#xff0c;配合视频理解更清晰&#xff5e; 软件的生命周期为&#xff1a;需求分析、软件设计、软件开发、运行维护直至被淘汰 几个阶段。 软件工程支持 4 个活动&#xff0c;简称 PDCA&#xff0c…...

纸上流年:Linux基础IO的文件理解与操作

文章目录 前言&#xff1a;数字世界的窗口&#x1f307;序章&#x1f3d9;️正文一、文件理解二、C语言文件操作2.1、文件打开2.2、文件关闭2.3、文件写入2.4、文件读取 三、系统级文件操作3.1、打开 open3.1.1、函数理解 3.2、关闭 close3.3、写入 write3.4、读取 read 四、小…...

基础深度补全模型DepthLab: From Partial to Complete

许多任务本身就包含部分深度信息&#xff0c;例如&#xff1a;&#xff08;1&#xff09;三维高斯图像修复&#xff1b;&#xff08;2&#xff09;激光雷达深度补全&#xff1b;&#xff08;3&#xff09;利用 Dust3R 进行稀疏视角重建&#xff1b;以及&#xff08;4&#xff0…...

15 秒写一首歌?AI 音乐生成模型 ACE-Step 上手体验!

在人工智能技术持续突破的浪潮中&#xff0c;音乐创作领域迎来了革命性的变革。近日&#xff0c;阶跃星辰与ACE Studio联合发布的开源音乐大模型ACE-Step&#xff08;中文名&#xff1a;音跃&#xff09;正式亮相&#xff0c;标志着AI音乐创作技术迈入全新阶段。这款集成了最新…...

如何在数据库中正确存储金额?

无论是开发电商平台、财务系统还是支付应用&#xff0c;金额的存储都是核心需求。但许多新手开发者常因字段类型选择不当&#xff0c;导致金额计算错误甚至资金损失。本文将用最通俗的语言&#xff0c;详细讲解如何专业地设计数据库中的金额字段。 一、为什么不能随便选字段类型…...

网络请求和状态管理

安装axios 创建项目&#xff0c;输入名称 新建文件夹&#xff1a; 在文件夹下输入cmd 运行 最后在复制到浏览器中 得到页面 使用axios axios封装成模块 实现一个学生信息案例 模拟数据&#xff0c;请求数据 安装完成后新建一个mock文件夹&#xff0c;制作一个模拟数据 配置…...

TIF导入TWF坐标方法

TIF坐标导入 1、打开Arcmap&#xff0c;将影像拖入界面&#xff0c;点击确定 2、点击工具箱→投影变换→定义投影 国家2000&#xff0c;WGS84坐标系 点击确定 显示已完成&#xff0c;即可 3、批处理 将需要定义的tif拖入到ARCMAP中&#xff0c;点击定义投影&#xff0c;右键…...

系统思考:动态性复杂

我们是否有遇到过这样的困境&#xff1f;做决策时&#xff0c;总觉得问题很简单&#xff0c;但总是看不清楚全貌。越做越复杂&#xff0c;最后好像什么都没解决&#xff0c;反而把事情弄得更糟。 其实&#xff0c;这就是动态性复杂的表现。它包含了两个关键因素&#xff1a;细节…...

智能体应用如何重塑未来生活?全面解析技术场景与实在Agent突破

智能体应用有哪些&#xff1f;在科技飞速发展的当下&#xff0c;人工智能正以前所未有的速度渗透到我们生活的方方面面。而智能体技术&#xff0c;作为人工智能领域的一颗璀璨新星&#xff0c;正逐渐展现出其重塑未来生活的巨大潜力。从办公效率的提升到医疗服务的优化&#xf…...

20.自动化测试框架开发之Excel配置文件的IO开发

20.自动化测试框架开发之Excel配置文件的IO开发 一、核心架构解析 1.1 类继承体系 class File: # 文件基类# 基础文件验证和路径管理class ExcelReader(File): # Excel读取器# 实现Excel数据解析逻辑1.2 版本依赖说明 # 必须安装1.2.0版本&#xff08;支持xlsx格式&#…...

1.1 Epson机器人常用指令1-Print函数、RobotInfo$

本文介绍Print, RobotInfo的使用. 主要总结如下&#xff1a; 1. Print可以向串口、网口、手操器TP1&#xff0c;RC软件等发送数据 2. RobotInfo$(4)可以得到机器人序列号。用于防止程序下载到其他机器人上。 3. CX, CY, CZ可以返回点的XYZ坐标值。 Rea…...

【机器人】复现 3D-Mem 具身探索和推理 | 3D场景记忆 CVPR 2025

3D-Mem 是用于具体探索和推理的3D场景记忆&#xff0c;来自CVPR 2025. 使用信息丰富的多视角图像&#xff0c;来表示场景并捕捉已探索区域的丰富视觉信息&#xff0c; 整合了基于前沿的探索&#xff0c;使智能体能够通过考虑已知和潜在的新信息&#xff0c;做出明智的决策。 …...

视觉-语言导航:综述与类别

22年4月来自国防科大的论文“Vision-Language Navigation: A Survey and Taxonomy”。 视觉-语言导航 (VLN) 任务要求智体遵循人类语言指令&#xff0c;在未曾见过的环境中导航。这个充满挑战的领域涉及自然语言处理、计算机视觉、机器人技术等领域&#xff0c;并催生了众多专…...

基于SpringBoot的家政预约系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

什么是子网委派?

Azure 子网委派的概念 子网委托使您能够为所选的 Azure PaaS 服务指定一个特定的子网,并将其注入到您的虚拟网络中。子网委托为客户提供了完全的控制权,可以管理 Azure 服务与其虚拟网络的集成。 当您将子网委托给 Azure 服务时,您允许该服务为该子网建立一些基本的网络配…...

5个yyds的.Net商城开源项目

今天一起来盘点下5个商城开源项目。 1、支持多语言、多商店的商城&#xff0c;.Net7 EF7领域驱动设计架构&#xff08;Smartstore&#xff09; 项目简介 Smartstore 支持桌面和移动平台、多语言、多商店、多货币的商城&#xff0c;并支持SEO优化&#xff0c;支持无限数量的…...

如何快速隔离被攻击的服务器以防止横向渗透

网络延迟过高会显著影响用户体验和服务性能&#xff0c;以下是系统化的排查思路和解决方案&#xff1a; --- ### **1. 快速定位问题范围** #### **基础检查** - **测试延迟目标**&#xff1a; bash ping <目标IP或域名> # 检查基础延迟&#xff08;ICMP…...

【解决】自己的域名任何端口都访问不到,公网地址正常访问,服务器报错500。

一、问题描述 后端项目部署在服务器上&#xff0c;通过域名访问接口服务器报错500&#xff0c;通过浏览器访问殒命的任何端口都是无法访问此网站。 但是通过公网地址访问是可以正常访问到的&#xff0c;感觉是域名出现了问题 二、解决过程 先说结论&#xff1a;问题原因是…...

Kubernetes MCP服务器(K8s MCP):如何使用?

#作者&#xff1a;曹付江 文章目录 1、什么是 Kubernetes MCP 服务器&#xff1f;1.1、K8s MCP 服务器 2、开始前的准备工作2.1. Kubernetes集群2.2. 安装并运行 kubectl2.3. Node.js 和 Bun2.4. &#xff08;可选&#xff09;Helm v3 3、如何设置 K8s MCP 服务器3.1. 克隆存储…...

RHCE 练习三:架设一台 NFS 服务器

一、题目要求 1、开放 /nfs/shared 目录&#xff0c;供所有用户查询资料 2、开放 /nfs/upload 目录&#xff0c;为 192.168.xxx.0/24 网段主机可以上传目录&#xff0c;并将所有用户及所属的组映射为 nfs-upload,其 UID 和 GID 均为 210 3.将 /home/tom 目录仅共享给 192.16…...

SpringBoot(二)--- SpringBoot基础(http协议、分层解耦)

目录 前言 一、SpringBoot入门 1.入门程序 2.解析 二、HTTP协议 1.HTTP概述 2.HTTP请求协议 2.1 GET方式的请求协议 2.2 POST方式的请求协议 2.3 两者的区别 2.4 获取请求数据 3.HTTP响应协议 三、分层解耦 1.三层架构 2.IOC&DI 2.1 入门 2.2 IOC详解 2.…...

mongodb部署Shard Cluster

一、创建集群认证文件 mkdir ./data ./confopenssl rand -base64 756 > ./conf/keyfilechmod 400 ./conf/keyfiledocker network create mongo-cluster二、部署configsever副本集 #!/bin/bash inamemongodb:8.0.9 conf_namemongo_conf_ replset_nameconfrsecho "…...

【大数据】MapReduce 编程--索引倒排--根据“内容 ➜ 出现在哪些文件里(某个单词出现在了哪些文件中,以及在每个文件中出现了多少次)

将 Hadoop 所需的 JAR 文件添加到项目中&#xff0c;确保可以使用 Hadoop 的 API JAR (Java Archive) 文件是一种用于打包多个 Java 类文件、资源文件&#xff08;如图片、配置文件等&#xff09;以及元数据的压缩文件格式。它类似于 ZIP 文件&#xff0c;但 JAR 文件通常用于 …...

使用PHP对接东南亚、日本、印度和印度尼西亚股票数据源

本文将介绍如何通过StockTV提供的API接口&#xff0c;使用PHP语言来获取并处理东南亚&#xff08;包括马来西亚、新加坡等&#xff09;、日本、印度以及印度尼西亚的股票市场数据。我们将以获取市场列表、查询公司信息、查看涨跌排行榜为例&#xff0c;展示具体的操作流程。 准…...

从基础到高级:网站反爬技术全景解析与第三方工具对比

网站反爬与用户行为检测实战指南:从基础防护到智能识别 在当今数据驱动的互联网时代,网站面临着日益复杂的爬虫攻击和恶意行为威胁。本文将系统性地介绍网站反爬与用户行为检测的技术体系,包括基本原理、防护策略、第三方组件选型以及真实案例分析,帮助开发者构建更加安全…...

docker安装Prometheus+Grafana

docker 安装Prometheus 下载镜像 很多镜像服务器都不行了&#xff0c;我用的这个地址还可以 查看可用docker镜像地址&#xff1a;https://cloud.tencent.com/developer/article/2485043 docker pull docker.xuanyuan.me/prom/prometheus:latest启动 docker run -itd --name…...

解决 Linux Bash 脚本因换行符问题导致的 “bash^M: No such file or directory“ 错误

一、问题重现 最近在部署一个 Bash 脚本时遇到一个诡异的问题&#xff1a; bash $ chmod x deploy.sh $ ./deploy.sh /usr/bin/env: ‘bash\r’: No such file or directory 明明脚本内容正确&#xff0c;权限也设置好了&#xff0c;为什么会出现这样的错误&#xff1f; 二…...

DS1302实时时钟模块

目录 0.单片机定时器时钟的几个缺点&#xff1a; 1.DS1302介绍 2.引脚定义和应用电路 3.原理图 4.内部结果框图&#xff0c;RAM&#xff08;寄存器&#xff09; 5.寄存器定义 6.时序定义 7.DS1302时钟代码 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a…...

redis的List为什么用ziplist和quicklist

redis的List为什么用ziplist和quicklist 压缩列表&#xff08;ziplist&#xff09; 是一种节省内存的数据结构&#xff0c;最早是 Redis 中为了减少内存开销而引入的一种顺序存储结构。它不是标准库里的内容&#xff0c;而是某些底层系统&#xff08;比如 Redis&#xff09;在…...

Java 后端基础 Maven

Maven 1.什么是Maven 2.Maven的作用 Maven核心 Maven概述 IDEA集成Maven 1.创建Maven项目 点击设置里的 Project Structure 将jdk和编译语言进行设置 随后点击apply点击ok 2.Maven坐标 3.导入Maven项目 将文件夹复制到当前项目的目录下 在这个目录下&#xff0c;在磁盘中…...

开源情报的发展前景与行业运用

开源情报系统在实际中的应用正随着技术进步和社会需求的增长而不断拓展&#xff0c;其在国家安全、军事、经济、公共卫生等多个领域展现出显著价值。以下是结合最新动态与案例的综合分析&#xff1a; 一、国家安全&#xff1a;从传统到现代的情报体系升级 开源情报在国家安全…...

《黑马前端ajax+node.js+webpack+git教程》(笔记)——node.js教程+webpack教程(nodejs教程)

黑马程序员前端AJAX入门到实战全套教程&#xff0c;包含学前端框架必会的&#xff08;ajaxnode.jswebpackgit&#xff09;&#xff0c;一套全覆盖 文章目录 Node.js与Webpack-01.Node.js入门定义和作用什么是前端工程化&#xff1f;&#xff08;离不开node.js&#xff09;Node.…...

Canvas设计图片编辑器全讲解(一)Canvas基础(万字图文讲解)

一、前序 近两年AI发展太过迅速&#xff0c;各类AI产品层出不穷&#xff0c;AI绘图/AI工作流/AI视频等平台的蓬勃发展&#xff0c;促使图片/视频等复杂内容的创作更加简单&#xff0c;让更多普通人有了图片和视频创作的机会。另一方面用户内容消费也逐渐向图片和视频倾斜。在“…...

disryptor和rabbitmq

disryptor和rabbitmq Disruptor 是什么&#xff1f; Disruptor 是一个由 LMAX Exchange 开发的高性能、低延迟的进程内&#xff08;in-process&#xff09;并发编程框架/库。它最初是为了解决金融交易系统中高吞吐量、低延迟消息传递的需求而设计的。 核心特点和设计理念&am…...

java基础-关键字:static、单例模式

1.例如&#xff1a;我们创造一个人的类&#xff0c;我们希望他是中国人类&#xff0c;所以我们希望所有对象都共有中国人的属性&#xff1b; import org.w3c.dom.ls.LSOutput;import java.sql.Connection; import java.sql.SQLOutput; import java.util.Arrays;public class Ma…...

深入解析PyTorch中MultiheadAttention的参数key_padding_mask与attn_mask

1. 基本背景 在multiheadattention中存在两个mask&#xff0c;一个参数是key_padding_mask&#xff0c;另外一个是attn_mask&#xff0c;尽管这两个参数是被人们所熟知的填充掩码和注意力掩码&#xff0c;但是深度理解以便清晰区分对于深刻理解该架构非常重要。 2. 参数Key_p…...

【Hadoop】--HA高可用搭建--3.2.2

修改环境配置文件 hadoop-env.sh # 在文件末尾添加以下内容&#xff1a; # java_home记得修改 export JAVA_HOME/usr/java/jdk1.8.0xxxx export HDFS_NAMENODE_USERroot export HDFS_DATANODE_USERroot export HDFS_ZKFC_USERroot export HDFS_JOURNALNODE_USERroot export YA…...

OpenCv(7.0)——银行卡号识别

文章目录 前言1.1 模板处理模块读取模板图像并预处理轮廓检测与处理构建数字模板库 1.2 银行卡图像预处理图像尺寸标准化形态学操作二值化与闭操作 1.3 卡号区域定位轮廓筛选逻辑 1.4 数字识别与结果展示完整代码展示总结 前言 本代码实现基于传统图像处理技术&#xff0c;通过…...

新手怎么样制作网站?

如果你是没有任何的建站基础&#xff0c;又没有任何的网站管理经验&#xff0c;那么应该如何开展网站制作呢&#xff1f;今天由我给大家分享一下网站制作的步骤和流程&#xff1a; 一、制定网站的核心主题&#xff1a; 在用户开展网站制作的之前&#xff0c;先确定一下以下的内…...

React集成百度【JSAPI Three】教程(002):设置不同的环境效果

文章目录 2、设置不同的天气2.1 安装antd前端UI库2.2 是否开启动态天空2.3 创建天气组件2.4 代码2.0版本下载2、设置不同的天气 2.1 安装antd前端UI库 安装命令: npm install antd --save2.2 是否开启动态天空 天气中的阴天、多云需要在开启动态天空后才能有效显示。在页面…...

Helm Chart 中配置多个 Docker Registry 地址以实现备用访问

在 Helm Chart 中配置多个 Docker Registry 地址以实现备用访问&#xff0c;可以通过以下几种方式实现&#xff1a; 1. 在 values.yaml 中定义多个 Registry 在 values.yaml 中定义主 Registry 和备用 Registry&#xff0c;以便在部署时灵活切换&#xff1a; # values.yaml …...

星云智控v1.0.0产品发布会圆满举行:以创新技术重构物联网监控新生态

星云智控v1.0.0产品发布会圆满举行&#xff1a;以创新技术重构物联网监控新生态 2024年5月15日&#xff0c;成都双流蛟龙社区党群服务中心迎来了一场备受业界瞩目的发布会——优雅草科技旗下”星云智控v1.0.0”物联网AI智控系统正式发布。本次发布会吸引了包括沃尔沃集团、新希…...