map和set(一)——关联式容器的常用接口使用及区别

news2025/5/19 15:09:31

一、关联式容器

在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面 、存储的是元素本身。

那什么是关联式容器?它与序列式容器有什么区别? 关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。

二、键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。

上次我们二叉搜索树讲到kv模型中key-val就是一个键值对,

在举个例子:如果键值对对应的是名字与拼音,以map的使用为例

#include<iostream>
#include<map>

using namespace std;

int main()
{
	map<string, string> dirt;
	dirt.insert(pair<string, string>("小明","xiaoming"));
	dirt.insert(make_pair("小李", "xiaoli"));
	pair<string, string> kv("张三", "zhangsan");
	dirt.insert(kv);

	return 0;
}

 三、set的使用

3.1set的介绍

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

 

 T是set中存放元素的类型,底层存储用<value,value>的键值对

Compare:set中元素默认按照小于来比较

Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理

 3.2set的构造

跟大部分的容器类似,这些我就不细讲了

函数声明        功能介绍
set (const Compare& comp = Compare(), const Allocator& = Allocator() );构造空的set
set (InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator() );用[first,last)区间中的元素构造set
set ( const set& x);拷贝构造

3.3set的迭代器

函数声明功能
iterator begin()返回set中起始位置元素的迭代器
iterator end()返回set中最后一个元素后面的迭代器
const_iterator cbegin() const返回set中起始位置元素的const迭代器
const_iterator cend() const返回set中最后一个元素后面的const迭代器
reverse_iterator rbegin()返回set第一个元素的反向迭代器,即end
reverse_iterator rend()返回set最后一个元素下一个位置的反向迭代器, 即rbegin
const_reverse_iterator crbegin() const返回set第一个元素的反向const迭代器,即cend
const_reverse_iterator crend() const返回set最后一个元素下一个位置的反向const迭 代器,即crbegin
#include<iostream>
#include<map>
#include<set>
using namespace std;
void test1()
{
	set<int> s;
	s.insert(5);
	s.insert(1);
	s.insert(6);
	s.insert(3);
	s.insert(4);
	s.insert(5);
	s.insert(1);
	set<int>::iterator it = s.begin();
	while (it!=s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

}
int main()
{
	test1();

	return 0;
}

set的遍历是有序的且会去重 

3.4set的容量

函数声明功能介绍
bool empty ( ) const检测set是否为空,空返回true,否则返回false
size_type size() const返回set中有效元素的个数

3.5set的修改操作

函数声明功能介绍
pair<iterator,bool> insert ( const value_type& x )在set中插入元素x,实际插入的是构成的 键值对,如果插入成功,返回该元素在set中的 位置,true>,如果插入失败,说明x在set中已经 存在,返回在set中的位置,false>
void erase ( iterator position )删除set中position位置上的元素
size_type erase ( const key_type& x )删除set中值为x的元素,返回删除的元素的个数
void erase ( iterator first, iterator last )删除set中[first, last)区间中的元素
void swap (set<key,compare,allocator>& st );交换set中的元素
void clear();将set中的元素清空
iterator find ( const key_type& x ) const返回set中值为x的元素的位置
size_type count ( const key_type& x ) const返回set中值为x的元素的个数

 

void test2()
{
	set<int> s;
	s.insert(5);
	s.insert(1);
	s.insert(6);
	s.insert(3);
	s.insert(4);

	auto start = s.lower_bound(3);  // >=val  左闭
	cout << *start << endl;

	auto finish = s.upper_bound(5); //>val   右开
	cout << *finish << endl;
	//s.erase(start, finish);//区间删除

	while (start != finish)//左闭右开
	{
		cout << *start << " ";
		++start;
	}
	cout << endl;

	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;
}

 

3.6使用演示 

void test1()
{
	set<int> s;
	s.insert(5);
	s.insert(1);
	s.insert(6);
	s.insert(3);
	s.insert(4);
	s.insert(5);
	s.insert(1);
	set<int>::iterator it = s.begin();
	while (it!=s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	set<int>::iterator pos = s.find(5);
	if (pos != s.end())
	{
		s.erase(pos);
	}
	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;
	s.erase(3);//存在则删除
	s.erase(10);//该数若不存在则不做处理
	for (auto e : s)
	{
		cout << e << " ";
	}

}

 

multiset的使用

multiset与set的区别是:multiset允许重复个元素

由此引申出一些成员函数的区别

count: 返回的是元素x的个数

erase:删除序列中所有的x

find:返回序列中的第一个x

四、map的使用

1. map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元 素。

2. 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的 内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型 value_type绑定在一起,为其取别名称为pair: typedef pair value_type;

3. 在内部,map中的元素总是按照键值key进行比较排序的。

4. map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序 对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。

5. map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。

6. map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。

4.1map的成员函数

构造

函数声明功能介绍
map()构造一个map

迭代器

 

容量

 

元素访问

mapped_type& operator[] (const key_type& k)返回去key对应的value

 修改及查找

insert

在map中插入键值对x,注意x是一个键值对,返回值也是键值对:iterator代表新插入 元素的位置,bool代表释放插入成功 

 

erase

 (1)删除pos位置上的元素

(2)删除键值为k的元素

(3)删除[first,last)区间中的元素

swap

 交换两个map中的元素

clear

将map中的元素清空

 

find

 

(1)在map中插入key为x的元素,找到返回该元 素的位置的迭代器,否则返回end

(2) 在map中插入key为x的元素,找到返回该元 素的位置的const迭代器,否则返回cend

count

返回key为x的键值在map中的个数,注意 map中key是唯一的,因此该函数的返回值 要么为0,要么为1,因此也可以用该函数来 检测一个key是否在map中

4.2map的使用

map的两个值是存到一个pair对象中的first(key)、second(val)

map的key(pair的first)不支持修改,val(pair的second)可以

pair的first有const修饰

void test_map1()
{
	map<string, string> dict;
	dict.insert(pair<string, string>("sort", "排序"));
	pair<string, string>kv("string", "字符串");
	dict.insert(kv);
	dict.insert({ "apple","苹果" });//C++11(构造函数)多参数的隐式类型转换
	//C++98常用
	dict.insert(make_pair("sort", "排序"));
	map<string, string>::iterator it = dict.begin();
	while (it!=dict.end())
	{
		//cout << (*it).first << " " << (*it).second << endl;
		cout << it->first << " " << it->second << endl;
		it++;
	}

}

map也有multi版本 

4.3额外内容

来看一下下面的代码

计算一个字符串数组中各字符串的出现次数


void test_map3()
{
	string arr[] = { "苹果","西瓜","香蕉","草莓","梨","苹果","香蕉","草莓","西瓜","苹果","西瓜" };
	//以水果为key(pair的first),出现次数为val(pair的second)
	map<string, int> countMap;
	for (auto& e : arr)
	{
		map<string, int>::iterator it = countMap.find(e);
		if (it != countMap.end())//出现过则second++
		{
			it->second++;
		}
		else//第一次出现就往map里存水果名字,出现次数是1
		{
			countMap.insert(make_pair(e, 1));
		}
	}
	for (auto& kv : countMap)
	{
		cout << kv.first << ":" << kv.second << endl;
	}
	cout << endl;
}

 

再看一下下面的

void test_map3()
{
	string arr[] = { "苹果","西瓜","香蕉","草莓","梨","苹果","香蕉","草莓","西瓜","苹果","西瓜" };
	//以水果为key(pair的first),出现次数为val(pair的second)
	map<string, int> countMap;
	for (auto& e : arr)
	{
		countMap[e]++;
	}
	for (auto& kv : countMap)
	{
		cout << kv.first << ":" << kv.second << endl;
	}
	cout << endl;
}

 

一句代码就解决了存字符串和出现次数的问题

operator[]通过这个key去返回val的引用

如果map中没有这个key?operator是借助map.insert来实现的

 

看一下insert的返回值,pair<iterator,bool>(这个pair不是map的pair),可以理解为类pair里有两成员变量

上面是对insert的返回值的first解引用再取其second 

如果这个值(要插入的值)没有,插入成功(bool为真),pair的first(iterator)是新插入元素所在节点的迭代器;

如果这个值以及存在(插入失败),bool为假,pair的first(iterator)指向已有此元素的迭代器

 

 

简化一下 

V& operator[](const K& key)
{
	pair<iterator, bool> ret = insert(make_pair(key, V()));
	return ret.first->second;
}

 

operator[]的功能

1.插入

2.查找

3.修改 

4.查找+修改

void test_map2()
{
	map<string, string> dict;
	dict.insert(make_pair("sort", "排序"));
	dict.insert(make_pair("string", "字符串"));
	dict.insert(make_pair("sort", "xxx"));

	dict["left"];//插入
	cout << dict["sort"] << endl;//查找
	dict["sort"] = "abc";//修改
	dict["right"] = "右边";//插入+修改
	for (auto& kv : dict)
	{
		cout <<kv.first<< ":"<<kv.second<<endl;
	}
	cout << endl;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于ACM32 MCU的两轮车充电桩方案,打造高效安全的电池管理

随着城市化进程的加快、人们生活水平的提高和节能环保理念的普及&#xff0c;越来越多的人选择了电动车作为代步工具&#xff0c;而两轮电动车的出行半径较短&#xff0c;需要频繁充电&#xff0c;因此在城市中设置两轮车充电桩就非常有必要了。城市中的充电桩不仅能解决两轮车…

NFTScan :什么是 ERC-404?深入解读 NFT 协议的未来

上月初&#xff0c;ERC-404 成为最首要热门的话题&#xff0c;ERC-404 是由 Pandora 团队在 2 月初为创作者和开发者等开源的实验性代币标准&#xff0c;其混合 ERC-20 / ERC-721 实现&#xff0c;具有原生流动性和碎片化等特点。伴随着早期的发展&#xff0c;越来越多参与者开…

Java基于微信小程序的旅游出行必备小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

钡铼技术R40工业路由器连接智慧交通助力城市智慧化建设

随着信息技术与交通行业的深度融合&#xff0c;智慧交通作为智慧城市的重要组成部分&#xff0c;正在全球范围内加速推进。在此进程中&#xff0c;钡铼技术推出的R40工业路由器以其独特的4G WiFi一体化设计&#xff0c;成为连接智慧交通各环节&#xff0c;助力城市智慧化建设的…

一文看懂 | 机器视觉前景

机器视觉概述&#xff1a;机器视觉是人工智能发展中的一个重要分支&#xff0c;其主要目标是用机器替代人眼进行测量和判断。 机器视觉系统通过图像摄取装置将目标转换成图像信号&#xff0c;然后传送给专用的图像处理系统&#xff0c;最终得到目标的形态信息。 全球机器视觉…

『python爬虫』ip代理池使用 协采云 账密模式(保姆级图文)

目录 实现效果实现思路代码示例总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 实现效果 在官网原版demo基础上小改了一下,修正了接口错误(把2023改成2024就可以了),原版demo只能测试单个ip,我这里批量测试所有…

项目管理软件大比拼:2024年推荐的9款软件一览

能够有效利用团队的力量并将其转化为切实解决方案的公司更有可能保持领先地位。项目管理软件是可以帮助组织实现这一目标的强大工具。本文将探讨项目管理软件的功能&#xff0c;并为大家介绍9款项目管理软件&#xff0c;为您的企业选择正确的软件时需要考虑的因素。 项目管理软…

java工程师面试宝典,springcloud微服务架构图

前言 昨天&#xff0c;有个女孩子问我提高数据库查询性能有什么立竿见影的好方法&#xff1f; 这简直是一道送分题&#xff0c;我自豪且略带鄙夷的说&#xff0c;当然是加「索引」了。 她又不紧不慢的问&#xff0c;索引为什么就能提高查询性能。 这还用问&#xff0c;索引…

企业计算机服务器中了faust勒索病毒怎么解密,faust勒索病毒解密流程

网络在为企业提供便利的同时&#xff0c;也为企业的数据安全问题带来严重威胁&#xff0c;网络安全是众多企业关系的主要话题&#xff0c;近期&#xff0c;云天数据恢复中心接到一大波企业的求助&#xff0c;企业的计算机服务器都被faust后缀勒索病毒攻击&#xff0c;导致企业计…

近屿智能A轮融资顺利收官,全新推出工程师与产品经理技能进阶路径

在2024年1月&#xff0c;上海近屿智能科技有限公司&#xff08;简称近屿智能&#xff09;顺利完成了其A轮融资&#xff0c;其中智望资本担任了主要的领投角色&#xff0c;金沙江创投也进行了追加投资。这次融资的成功&#xff0c;充分展现了近屿智能在AIGC行业中的技术领先地位…

老大语录二 谈规划

老大语录二 谈规划 我们经常要去规划一个产品在某阶段应该要做哪些功能以及舍弃哪些功能。这是一个特别复杂也特别专业的事情。很多时候在判断时往往经验主义会主导我们的决策,也常常会发生我们陷入局部某个功能的讨论来评价该功能的利弊去留。决策误判也就是在这些场景下被引…

kibana配置 dashbord,做可视化展示

一、环境介绍 这里我使用的kibana版本为7.17版本。 语言选择为中文。 需要已经有es&#xff0c;已经有kibana&#xff0c;并且都能正常访问。 二、背景介绍 kibana的可视化界面&#xff0c;可以配置很多监控统计界面。非常方便&#xff0c;做数据的可视化展示。 这篇文章&…

计算机网络 网络原理之Http

目录 1 前言2 什么是http的一次交互&#xff1f;3 理解“协议”二字4 认识URL4.1 简介4.2 URL的编码和解码(urlencode和urldecode) 5 抓包工具 fiddler6 http和https的区别7 http 头8 HTTP 状态码9 常见的 Http 服务器 1 前言 为什么要了解Http原理呢&#xff1f;因为http原理…

鸿蒙NEXT开发实战:【网络管理-数据请求】

概述 本示例仿postman输入API接口地址&#xff0c;获取相应数据&#xff0c;介绍数据请求接口的用法。 样例展示 基础信息 Http 介绍 本示例通过[ohos.net.http]等接口&#xff0c;实现了根据URL地址和相关配置项发起http请求的功能。 效果预览 首页结果页 使用说明 1.…

每日一练 | 华为认证真题练习Day193

1、关于永久组播地址的描述&#xff0c;错误的是: A. 网段内所有主机和路由器都侦听224. 0. 0.1。 B. 所有路由器都侦听224 .0 .0.2 C. 所有运行OSPF协议的路由器都侦听224.0.0.5 D. 所有运行RIP V2协议的路由器都侦听224.0.0.100 2、ISIS协议所支持的网络类型除P2P以外还有…

搭建Zabbix监控系统

概述 Zabbix是一个基于Web界面的企业级开源监控套件&#xff0c;提供分布式系统监控与网络监视功能。具 备主机的性能监控&#xff0c;网络设备性能监控&#xff0c;数据库性能监控&#xff0c;多种告警方式&#xff0c;详细报表、图表的绘制等 功能。监测的对象可以是Linux或 …

Android岗面试,面试完腾讯我才发现这些知识点竟然没掌握全

前言 H 点击领取完整开源项目《安卓学习笔记总结最新移动架构视频大厂安卓面试真题项目实战源码讲义》 i~&#xff0c;我是 2020 届物联网专业毕业生&#xff0c;现就读于杭州。谨以此文来记录我的秋招以及入门前端以来的学习历程&#xff0c;如有错误&#xff0c;希望大家能及…

逻辑代数基础(二)(卡诺图)

目录 逻辑图表示 卡诺图表示 卡诺图的标准格式 二变量卡诺图 三变量卡诺图 四变量卡诺图 卡诺图表示逻辑函数 从逻辑表达式到卡诺图 逻辑代数的三个规则 代入规则 反演规则 对偶规则 逻辑函数的化简方式 化简逻辑函数的意义 逻辑函数最简表示式的判别标准 公式化简法 并…

java工程师面试突击第二季分布式,Java多线程从基础到并发模型统统帮你搞定

面试准备 不论是校招还是社招都避免不了各种面试、笔试&#xff0c;如何去准备这些东西就显得格外重要。 运筹帷幄之后&#xff0c;决胜千里之外&#xff01;不打毫无准备的仗&#xff0c;我觉得大家可以先从下面几个方面来准备面试&#xff1a; 1. 自我介绍。&#xff08;介…

Windows安装MySQL8.0详细步骤

目录 一、官网下载MySQL二、将压缩包解压到没有中文和空格的目录下三、设置配置文件四、配置环境变量五、安装初始化mysql服务 一、官网下载MySQL 进入MySQL官网&#xff1a;https://downloads.mysql.com/archives/community/&#xff0c;下载 Windows (x86, 64-bit), ZIP Arch…