【C++】泛型算法(六)Map和Set的使用

2023-09-21 21:32:03

Map

map<key, value>
key起到索引的作用。

//常见使用:字数统计程序
#include <map>
#include <string>
map<string, int> words; //string是key, int是value

string tword;
while(cin >> tword)
{
	words[tword]++; //字数统计
	//其中words[tword]取出与tword相应的value
	//如果tword不在map里,则它会因此被放入map中,并获得默认值0
}

map<string,int>::iterator it=words.begin();
for (; it!=word.end(); ++it)
	cout<<"key:"<<it->first 		  //first对应key
		<<"value:"<<it->second<<endl; //second对应value
									  //cout输出字眼在map里出现的次数

查询map内是否存在某个key的三种方法

方法一:key索引

int count = 0;
if(!(count = words["vermeer"]))

缺点:如果key不存在于map内,这个key会被自动加入map中,对应的value被设置为所属类型的默认值

方法二:利用map自带的find()函数

int count = 0;
map<string,int>::iterator it;

it = words.find("vermeer");
if (it != words.end())
	count = it->second;

如果key已放在其中,find()会返回一个iterator,指向key/value形成pair(pair class是标准库的一员),反之则返回words.end()。

方法三:利用map自带的count()函数

int count = 0;

if(words.count("vermeer"))  //只要存在
    value = words["vermeer"];

count()会返回某特定项在map内的个数

任何一个key在map内最多只会有一份,如需储存多份相同的key,就必须使用multimap。(略)

Set

Set由一群key组合而成;
如果想知道某值是否存在于某个集合内,可以用set。

//常见应用:统计排除的字集
#include<set>
#include<map>
#include<string>

map<string,int>words;
stirng tword;
set<string>word_exclusion;//set只有key值

while(cin >> tword)
{
	if(word_exclusion.count(tword));
	//如果tword在“排除字集”内,则此次迭代被跳过
		continue;
	
	words[ tword ]++;//到达此处说明tword不属于需要排除的字集,纳入map
}

set:升序排列

默认情况下,set里的元素默认升序排列(从小到大排列)

int ia[10]={1,3,5,8,5,3,1,5,8,1};
vector<int>vec(ia,ia+10);
set<int>iset(vec.begin(),vec.end());
//iset的元素为{1,3,5,8}
//(已经排除了和1,3,5,8相同的元素)

set:加入元素

  1. 为set加入单一元素,可使用单一参数的insert():
iset.insert(ival);//ival为单一元素
  1. 为set加入多个元素,可使用双参数的insert():
iset.insert(vec.begin(),vec.end());

set:迭代

使用泛型指针iterator

set<int>::iterator it=iset.begin();
for(; it!=iset.end(); ++it)
{
	cout << *it << ' ';
}
cout << endl;

泛型算法中还有其他和set相关的泛型算法:
set_intersection(),
set_union(),
set_difference(),
set_symmetric_difference()

对于任何key值,set只能储存一份,要储存多份相同key值,必须使用multiset。(略)

更多推荐

大二毕设.3-网盘系统

目录技术选型:功能概括:基本演示:实现讲解:技术选型:前端:Vue3+ElementPlus后端:SpringBoot+Mybatis-Plus+MySQL+Redis+Caffeine+FastDFS/OSS+SpringCloudStream+RocketMQ+Zookeeper功能概括:用户模块用户注册接口幂等性

探索web3.0

先说从web1.0、web2.0、web3.0的进化之路。Web1.0,第一代互联网,静态互联网;Web1.0的核心为:平台创造、平台所有、平台控制、平台受益。Web2.0,第二代互联网,交互式互联网;Web2.0的核心为:用户创造、平台所有、平台控制、平台受益。Web3.0,第三代互联网,协议互联网;Web3.0的核

计算机专业毕业设计项目推荐06-工作室管理系统(Java+Vue+Mysql)

工作室管理系统(JavaSpring+Vue+Mysql)**介绍****系统总体开发情况-功能模块****各部分模块实现****最后想说的****联系方式**介绍本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式,在

云计算的未来:云原生架构和自动化运维的崭露头角

文章目录云计算的演进云原生架构1.容器化2.微服务3.自动化部署和扩展4.故障恢复自动化运维1.基础设施即代码(IaC)2.运维自动化示例:使用Ansible自动化配置管理3.自动化监控和报警未来展望1.更多的自动化2.多云混合云3.边缘计算4.安全性结论🎉欢迎来到云计算技术应用专栏~云计算的未来:云原生架构和自动化

自动化发布npm包小记

1.注册npm账号打开npm官网,并注册自己的npm账号2.申请AccessToken1.登录npm官网,登录成功后,点开右上角头像,并点击AccessTokens选项2.点开GenerateNewToken下拉框,点击ClassicToken(和GranularAccessToken有什么区别,请自行查验?)3.填写

WPF行为

行为是一款重用用户界面代码的更有挑战性的工具。其基本思想是:使用行为封装一些通用UI功能。如果具有适当的行为,可使用一两行XAML标记将其附加到任意元素,从而节省编写和调试代码的工作。样式提供了重用一组属性设置的实用方法。它们帮助构建一致的、组织良好的界面迈出了重要的第一步——但它们还有许多限制。问题是在典型的应用程序

多级缓存基础架构组件设计

基础架构组件-缓存背景目的缓存架构服务层多级缓存核心流程设计1、缓存介质2、如何实现spring注解方式多级缓存如何实现缓存的永久存储又可以过期刷新,而避免缓存失效带来的一系列缓存雪崩、击穿等问题实现缓存包装类多级缓存处理器实现1、lookup(Objectkey)2、get(Objectkey)3、重头戏get(Ob

Lua 多返回值

Lua这门神奇的语言可以在函数里面返回多个值具体函数如下functionmulti_return()return2,"hellowworld"endlocala,b=multi_return();--多个都返回print(a,b)localm=multi_return();--默认返回第一个返回值print(m)unp

搭建Flink集群、集群HA高可用以及配置历史服务器

Flink集群搭建Flink集群搭建集群规划下载并解压安装包修改集群配置分发安装目录启动集群访问WebUIFlink集群HA高可用概述集群规划配置flink配置master、workers配置ZK分发安装目录启动HA集群测试Flink参数配置配置历史服务器概述配置启动、停止历史服务器提交一个Job任务查看历史Job信息

数据结构上机练习——单链表的基本操作、头文件、类定义、main函数、多种链表算法的实现,含注释

文章目录单链表的基本操作实现1.头文件2.类定义和多种算法的实现2.1创建空表2.2头插法创建n个元素的线性链表2.3一个带头节点的链表存放一组整数,设计一个算法删除值等于x的所有节点。2.4计算线性表中值为偶数的节点个数2.5一个带头节点的单链表heada存放一组整数,设计分裂heada算法,偶数放在heada中,奇

二叉树的概念、存储及遍历

一、二叉树的概念1、二叉树的定义二叉树(binarytree)是n个结点的有限集合,该集合或为空集(空二叉树),或由一个根结点与两棵互不相交的,称为根结点的左子树、右子树的二叉树构成。二叉树的特点是:(1)每个结点最多有两棵子树,故二叉树中不存在度大于2的结点。(2)二叉树是有序的,其次序不能任意颠倒,即使树中的某个结

热文推荐