map set

目录

一、关联式容器

二、键值对

三、树形结构的关联式容器

3.1 set

3.1.1 set的介绍        

3.1.2 set的使用       

3.2 multiset        

3.2.1 multiset的介绍         

3.2.2 multiset的使用         

3.3 map       

3.3.1 map的介绍         

3.3.2 map的使用        

3.4 multimap       

3.4.1 multimap的介绍      

3.3.2 multimap的使用         


        如果你已经了解了KV二叉搜索树,将会更容易读懂本文 


一、关联式容器

        STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。

        


二、键值对

        用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义,那么我们就可以通过键值对来描述这种关系。

SGI-STL中关于键值对的定义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){}
};

        


三、树形结构的关联式容器

        根据应用场景的不桶,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。下面一依次介绍每一个容器。

3.1 set

3.1.1 set的介绍        

文档介绍

set - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/set/set/?kw=set

  • set是按照一定次序存储元素的容器,底层是用二叉搜索树(红黑树)实现的
  • 对于set,元素的value也标识它本身(即value就是key,类型为T),并且每个value必须是唯一的(确保每个元素都可以标识它本身)。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们
  • 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序(默认按照小于来比较)
  • set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代

                

3.1.2 set的使用       

详细内容见文档介绍,下面是接口和示例代码:接下来,通过下面这段代码学习 lower_bound 和 up_bound      

void test_set2()
{set<int> myset;set<int>::iterator itlow, itup;for (int i = 1; i < 10; i++) myset.insert(i * 10);// 10 20 30 40 50 60 70 80 90itlow = myset.lower_bound(30);	    // >= val值位置的iteratoritup = myset.upper_bound(70);		// >  val值位置的iteratorset<int>::iterator it = itup;while (it != myset.end()){cout << *it << " ";++it;}cout << endl;						// 80 90myset.erase(itlow, itup);		    // 10 20 70 80 90for (auto e : myset){cout << e << " ";}cout << endl;
}void test_set3()
{std::set<int> myset;for (int i = 1; i <= 5; i++) myset.insert(i * 10);   // myset: 10 20 30 40 50//std::pair<std::set<int>::const_iterator, std::set<int>::const_iterator> ret;auto ret = myset.equal_range(35);std::cout << "the lower bound points to: " << *ret.first << '\n';   // >= valstd::cout << "the upper bound points to: " << *ret.second << '\n';  // > val
}

        

3.2 multiset        

3.2.1 multiset的介绍         

文档介绍

multiset - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/set/multiset/?kw=multiset

  • multiset是按照特定顺序存储元素的容器,其中元素是可以重复的,multiset底层结构为二叉搜索树(红黑树)
  • 在multiset中,元素的value也会识别它本身(因为multiset中本身存储的就是<value, value>组成的键值对,因此value本身就是key,key就是value,类型为T)。multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除
  •  在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则进行排序
  • multiset容器通过key访问单个元素的速度通常比unordered_multiset容器慢,但当使用迭代器遍历时会得到一个有序序列

        

3.2.2 multiset的使用         

仅演示与set的不同之处,大体上可以参考set的用法        

void test_multiset()
{// 排序multiset<int> s;s.insert(5);s.insert(2);s.insert(6);s.insert(1);s.insert(5);s.insert(2);multiset<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;// 如果有多个值,find返回中序第一个valit = s.find(5);while (it != s.end()){cout << *it << " ";++it;}cout << endl;cout << s.count(2) << endl;// [>=val, >val)//auto ret = s.equal_range(2);//s.erase(ret.first, ret.second);size_t n = s.erase(2);cout << n << endl;for (auto e : s){cout << e << " ";}cout << endl;
}VS2022 运行结果1 2 2 5 5 6
5 5 6
2
2
1 5 5 6

        

3.3 map       

3.3.1 map的介绍         

文档介绍

map - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/map/map/?kw=map

  • map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))
  • 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair:typedef pair<const key, T> value_type;
  • 在内部,map中的元素总是按照键值key进行比较排序的(默认按照小于的方式对key进行比较)。
  • map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
  • map支持下标访问符,即在[]中放入key,就可以找到与key对应的value

        

3.3.2 map的使用        

void test_map1()
{map<string, string> dict;dict.insert(pair<string, string>("sort", "排序"));dict.insert(pair<string, string>("insert", "插入"));dict.insert(pair<const char*, const char*>("left", "左边"));//dict.insert(make_pair("right", "右边")); // 优化dict["erase"];					// 插入cout << dict["erase"] << endl;  // 查找dict["erase"] = "删除";			// 修改cout << dict["erase"] << endl;  // 查找dict["test"] = "测试";			// 插入+修改dict["left"] = "左边、剩余";	// 修改string s1("xxxx"), s2("yyyy");dict.insert(make_pair(s1, s2));map<string, string>::iterator it = dict.begin();while (it != dict.end()){    // 三种打印方式cout << (*it).first << ":" << (*it).second << endl;//cout << it.operator->()->first << ":" << it.operator->()->second << endl;//cout << it->first << ":" << it->second << endl;++it;}cout << endl;for (auto& kv : dict){// kv.first += 'x';kv.second += 'x';cout << kv.first << ":" << kv.second << endl;}
}运行结果删除
erase:删除
insert:插入
left:左边、剩余
right:右边
sort:排序
test:测试
xxxx:yyyyerase:删除x
insert:插入x
left:左边、剩余x
right:右边x
sort:排序x
test:测试x
xxxx:yyyyx

使用map统计水果出现的次数

void test_map2()
{string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };map<string, int> countMap;//for (auto& str : arr)//{//	//auto ret = countMap.find(str);//	//if (ret == countMap.end())//	//{//	//	// 没有表示第一次出现,插入//	//	countMap.insert(make_pair(str, 1));//	//}//	//else//	//{//	//	// 有就让次数++//	//	ret->second++;//	//}//	countMap[str]++;//}// 更优代码for (auto& str : arr){countMap[str]++;}for (auto& kv : countMap){cout << kv.first << ":" << kv.second << endl;}
}

extra map的[ ]重载代码剖析        

        

3.4 multimap       

3.4.1 multimap的介绍      

文档介绍        

multimap - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/map/multimap/?kw=multimap        

  • multimaps是关联式容器,它按照特定的顺序,存储由key和value映射成的键值对<key,value>,其中多个键值对之间的key是可以重复的。multimap在底层用二叉搜索树(红黑树)来实现。
  • 在multimap中,通常按照key排序和惟一地标识元素,而映射的value存储与key关联的内容。key和value的类型可能不同,通过multimap内部的成员类型value_type组合在一起,value_type是组合key和value的键值对:typedef pair<const Key, T> value_type;
  • 在内部,multimap中的元素总是通过其内部比较对象,按照指定的特定严格弱排序标准对key进行排序的。
  • multimap通过key访问单个元素的速度通常比unordered_multimap容器慢,但是使用迭代器直接遍历multimap中的元素可以得到关于key有序的序列。

        

3.3.2 multimap的使用         

        multimap中的接口可以参考map,功能都是类似的,需要注意的是:multimap没有重载operator[]操作(为什么?)
        multimap可以有多个重复的key,那么operator[ ]返回哪个key的value呢?        


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

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

相关文章

[ poi-表格导出 ] java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader

解决报错&#xff1a; org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader 报错描述&#xff1a; 表格导出本来使用正常&#xff0c;偶然就报了以上错误…

onnx 模型加载部署运行方式

1.通过文件路径的onnx模型加载方式: 在onnxruntime下面的主要函数:session Ort::Session(env, w_modelPath.c_str(), sessionOptions); 这里的文件路径是宽字节的&#xff0c;通过onnx文件路径直接加载模型。 在opencv下使用dnn加载onnx模型的主要函数: std::string model…

使用Llama index构建多代理 RAG

检索增强生成(RAG)已成为增强大型语言模型(LLM)能力的一种强大技术。通过从知识来源中检索相关信息并将其纳入提示&#xff0c;RAG为LLM提供了有用的上下文&#xff0c;以产生基于事实的输出。 但是现有的单代理RAG系统面临着检索效率低下、高延迟和次优提示的挑战。这些问题在…

【雷达原理】雷达杂波抑制方法

目录 一、杂波及其特点 1.1 什么是杂波&#xff1f; 1.2 杂波的频谱特性 二、动目标显示(MTI)技术 2.1 对消原理 2.2 数字对消器设计 三、MATLAB仿真 3.1 对消效果验证 3.2 代码 一、杂波及其特点 1.1 什么是杂波&#xff1f; 杂波是相对目标回波而言的&#xff0c;…

图片复制上传,拖拽输入框上传,el-upload自定义上传方法(上传和备注框强关联)

1. 效果图&#xff1a; 2. 复制图片使用的方法&#xff1a; 1.通过监听paste方法&#xff0c;获取复制内容2.获取复制内容中的clipboardData3.获取file文件进行上传 <input paste.native"handlePaste" />handlePaste(value){let files value.clipboardData…

竞赛 深度学习猫狗分类 - python opencv cnn

文章目录 0 前言1 课题背景2 使用CNN进行猫狗分类3 数据集处理4 神经网络的编写5 Tensorflow计算图的构建6 模型的训练和测试7 预测效果8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习猫狗分类 ** 该项目较为新颖&a…

AI写作软件哪个好?这3个AI写作神器用了都说好!

随着信息时代的快速发展&#xff0c;AI写作早已成为人们创作内容的重要途径之一&#xff0c;在使用AI软件进行创作之前&#xff0c;当然要选择一个优质的写作软件&#xff0c;不过只要你拥有了这3款写作神器&#xff0c;你就能轻松创作出高质量的文章&#xff0c;我们一起来看看…

前端找工作好难啊,准备转行了

前言 23年本科应届生&#xff0c;培训机构出来找了2个月&#xff0c;全国海投&#xff0c;3k白干都没人要。 所以经过朋友的推荐&#xff0c;我开始学习网络安全&#xff0c;一共学了大概 5 个多月的时间&#xff0c;今年的 3 月 6 号在长沙找到了一份安全研发的工作&#xff…

建议收藏《2023华为海思实习笔试-数字芯片真题+解析》(附下载)

华为海思一直以来是从业者想要进入的热门公司。但是岗位就那么多&#xff0c;在面试的时候&#xff0c;很多同学因为准备不充分&#xff0c;与岗位失之交臂&#xff0c;无缘进入该公司。今天为大家带来《2023华为海思实习笔试-数字芯片真题解析》题目来源于众多网友对笔试的记录…

HTML 表格

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>表格标签</title>/* <style>.yun {widt…

Pytest-Allure及Allure命令使用

一、Allure介绍 Allure是Pytest用于生成测试报告的框架&#xff0c;提供丰富的测试报告功能&#xff1b; 二、Allure安装 Allure安装分为2块&#xff0c;分别是pytest-Allure库安装&#xff0c;本地生成报告并导出的命令行allure安装&#xff1b; 1、pytest-Allure库安装 …

AITO问界崛起的“临门一脚”,落在了赛力斯汽车的智慧工厂里

文 | 智能相对论 作者 | 沈浪 AITO问界新M7的销量爆了&#xff0c;口碑也紧接着“爆”了。 AITO问界新M7系列上市以来50天&#xff0c;累计大定突破8万辆。AITO问界M9预计今年12月上市&#xff0c;预订超过了1.5万辆。根据最新公布的产销数据&#xff0c;在过去的10月份&…