11.3 关联容器操作

news2024/9/30 1:40:16

文章目录

    • 关联容器迭代器
      • 关键字成员不可修改,值可修改
      • 关于泛型算法
    • 添加元素
      • 向set插入元素
      • 向map插入数据
      • insert操作总结
      • 检测insert的返回值
      • 展开递增语句
      • 向multiset和multimap添加元素
    • 删除元素
    • map下标操作
    • 访问元素

类型别名:

类型别名说明
key_type关键字类型,map的first或者set的元素
mapped_typemap中值类型
value_typeset为const key_type;map中为pair<const key_type,mapped_type>

关联容器迭代器

解引用一个关联迭代器,会得到类型为value_type的值引用。

#include<iostream>
#include<map>
#include<set>

using namespace std;

int main() 
{
	map<string, int> word_count = { {"red",1},{"green",2},{"pipi",3}};
	set<string> limit = { "the","a","an" };
	auto beg1 = word_count.begin();
	auto beg2 = limit.begin();
	cout << beg1->first << "   " << beg1->second << endl;
	beg1++;
	cout << beg1->first << "   " << beg1->second << endl;
	cout << *beg2 << endl;
	beg2++;
	cout << *beg2 << endl;
	/*输出结果:green   2
				pipi   3
				a
				an
	*/
	return 0;
}

关键字成员不可修改,值可修改

虽然set类型同时定义了iterator 和const_ iterator 类型,但两种类型都只允许只读访问set中的元素。与不能改变-一个map元素的关键字一样,一个set中的关键字也是const的。可以用- 一个set迭代器来读取元素的值,但不能修改。

关于泛型算法

一般不在关联容器中应用泛型算法,实际应用一般作为源序列或目的位置。

最多常用的泛型算法仅有find,查询不修改重排内部的值,或者copy把关联容器当作复制的对象,复制到其他相关容器中。

添加元素

向set插入元素

使用insert函数插入,插入的方式有三种,一种是插入具体元素,一种是插入一个范围,还有一种是插入一段序列。

由于set内部的数据是不重复的,就算插入重复的,对于set来说只是自动去重而已,并不是很严重。

样例:

#include<iostream>
#include<map>
#include<set>
#include<vector>

using namespace std;

int main() 
{
	vector<int> vec = { 1,1,2,2,3,4,5 };
	set<int> set1, set2,set3;
	set1.insert(vec[0]);
	set2.insert(vec.begin(), vec. end());
	set3.insert({ 1,1,2,2,3,4,5 });
	cout << "set1:";
	for (auto i : set1 )
	{
		cout << i << " ";
	}
	cout << endl<<"set2:";
	for (auto i : set2)
	{
		cout << i << " ";
	}
	cout << endl << "set3:";
	for (auto i : set3)
	{
		cout << i << " ";
	}
	return 0;
}

输出结果:
在这里插入图片描述

向map插入数据

基本上是以下的四种写法:

stu.insert({ "qq",4 });
stu.insert(make_pair("aa",5 ));
stu.insert(pair<string,int>("bb", 6));
stu.insert(map<string, int>::value_type("cc", 7));

insert操作总结

	//args代表构造出一个与c所需要的类型一致的数据。
	//插入单个值
	//对于map和set,只有关键词不在c中时,才对容器进行插入操作。返回一个pair,指向具有指定在关键字元素的迭代器和插入是否成功的bool值。
	//对于multimap和multiset,可以插入,返回指向新元素的迭代器。
	> c.insert(v)   
	> c.emplace(args)
	//p指出从哪里开始搜索新元素存储的位置。返回指向给定关键字元素的迭代器。
	> c.insert(p,v)
	> c.emplace(p,args)
//插入多个值,返回void
	> c.insert(b,e)
	> c.insert(il)

值得关注的是:
map元素再次插入即是修改其值。

#include<iostream>
#include<map>

using namespace std;

int main() 
{
	map<string, int> map1 = { {"张三",1},{"李四",2} };
	map1.insert(make_pair("张三", 2));
	cout << map1.begin()->second << endl;
	//输出结果:2
	return 0;
}

检测insert的返回值

insert ( 或emplace)返回的值依赖于容器类型和参数。对于不包含重复关键字的容器(常指map和set),添加单一元素的insert 和emplace版本返回一个pair,告诉我们插入操作是否成功。pair的first成员是一个迭代器,指向具有给定关键字的元素;:second成员是一个bool值,指出元素是插入成功还是已经存在于容器中。如果关键字已在容器中,则insert什么事情也不做,且返回值中的bool部分为false. 如果关键字不存在,元素被插入容器中,且bool值为true。

	auto j = stu.insert({ "qq",4 });
	cout << "j "<<(j.first)->first << " " << (j.first)->second<< " " << j.second << endl; //j qq 4 1
	auto k = stu.insert({ "qq",4 });
	cout << "k " << (k.first)->first << " " << (k.first)->second << " " << k.second << endl; //k qq 4 0
	//k和j的实际类型为:pair<map<string,int>::iterator,bool>

展开递增语句

计算字母出现次数:

	string s;
	cout << "input string:" << endl;
	cin >> s;
	map<char, int> lettertimes;
	for (char a : s) {
	//循环内可以修改为:++lettertimes.insert({a,0}).first->second;
		auto p = lettertimes.insert({ a, 1 });
		if (!p.second) {
			++p.first->second;
		}
	}
	for (auto i : lettertimes) {
		cout << i.first << " " << i.second << endl;
	}

++p.first->second;此句是重点,代表着实际上也就是对应字符的数字++

向multiset和multimap添加元素

以multimap为例子吧:

	multimap<string, string> vec;
	//插入第一个元素 关键字为张三
	vec.insert("张三", "李四");
	//插入第二个元素,关键字仍然为张三
	vec.insert("张三", "王五");

对允许重复关键字的容器,接受单个元素的insert操作返回一个指向新元素的迭代器。这里无须返回一个bool值,因为insert总是向这类容器中加入一个新元素。

删除元素

c.erase(k) //删除关键词为k的元素,返回size_type值,即删除元素数量,返回0表示map中没有要删除元素
c.erase(p) //删除迭代器p处元素,返回p之后元素的迭代器,或c.end()
c.erase(b,e) //删除迭代器b~e范围元素,返回e

map下标操作

map和unordered_map提供了下标运算和对应at函数,当关键字不在map中时,下标操作会为该关键字创建元素并插入到map中,关联值可以被值初始化。

只可以对非const类型map进行下标操作。

set、multimap、unordered_multimap不支持下标运算。set中没有值对应关键字。multimap、unordered_multimap存在单关键字对多值。

//访问
	cout << stu["hh"] << endl; //1
	cout << stu.at("hh") << endl; //1
//插入并进行值初始化
	stu["xh"] = 23;
	cout << stu["xh"] << endl;
	stu["hx"]; //值为0

对于顺序容器,解引用和下标运算返回类型一样。而对于map,下标操作返回mapped_type类型(返回的是值),而迭代器运算符返回的是value_type类型(关键字-值对)。

访问元素

//不需要计数时使用find。需要计数使用count
c.find(k)  //返回指向第一个关键字k元素的迭代器。k不在容器中时返回尾后迭代器
c.count(k) //返回关键字k数量
c.equal_range(k) //对于multimap和multiset,同关键字元素会相邻储存,通过此函数查找,返回迭代器pair,表示关键词等于k的元素范围。k不存在时,返回{c.end(),c.end()}。

//不适用于无序容器
c.lower_bound(k) //返回指向第一个不小于关键字k的元素的迭代器,指向第一个k
c.upper_bound(k) //返回指向第一个大于关键字k的元素的迭代器,指向最后一个k

小总结:

  1. 在不需要创建新的map的时候,使用find代替下标操作,因为下标操作的时候,不存在他会进行创建,造成不必要的麻烦。
  2. c.equal_range(k)一般可以应用于:查找某一作者(关键字)的数目(值)。查找班级中姓李(关键字)的人名(值)等。

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

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

相关文章

第一个Spring、第一个SpringBoot、Spring-Mybatis整合、SpringBoot-Mybatis整合

目录一、第一个Spring程序二、第一个SpringBoot三、Spring-Mybatis整合四、SpringBoot-Mybatis整合第一个程序一、第一个Spring程序 添加依赖——用以支持spring <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</a…

线程池的简单介绍以及实现一个线程池

文章目录1、线程池存在的意义2、什么是线程池&#xff1f;3、线程池的使用2、java标准库中的线程池3、认识一下不同的线程池&#xff1a;4、认识一下线程池里的参数&#xff1a;4、实现一个简单的线程池1、线程池存在的意义 线程存在的意义&#xff1a;使用进程来实现并发编程…

鼠标右键没有git bash here(图文详解)

升级Win11后突然发现右键没有git bash here了解决&#xff1a;1. winr键&#xff0c;打开命令窗口,输入regedit打开注册表2. 在注册表中按照路径打开\HKEY_CLASSES_ROOT\Directory\Background\shell\3. 在shell上右键新建项&#xff0c;取名Git Bash Here&#xff0c;再点击Git…

SpringCloudConsul

上篇文章注册中心选出了Consul 和 K8S&#xff0c;现在我需要把他们集成到SpringCloud里&#xff0c;体验一下他们的服务注册发现、动态配置与权限分配难易 问题&#xff0c;以便选出更适合我们的。SpringCloudConsul首先用Docker搭建出Consul集群&#xff0c;这一步忽略了&…

8、Ubuntu22.4Server安装MariaDB10.10初始化密码Navicat远程登录

安装MariaDB10.10 查找源 apt search mariadb 在Ubuntu系统上从MariaDB存储库安装MariaDB10.10时&#xff0c;需要运行以下命令 sudo apt-get install apt-transport-https curl sudo curl -o /etc/apt/trusted.gpg.d/mariadb_release_signing_key.asc https://mariadb.org…

【微服务】Feign远程调用

本系列介绍的是Spring Cloud中涉及的知识点&#xff0c;如有错误欢迎指出~ 一.引子 我们以前基于RestTemplate发起的http请求远程调用服务&#xff1a; 存在下面的问题&#xff1a; 代码可读性差&#xff0c;编程体验不统一 参数复杂URL难以维护&#xff0c;字符串拼接硬编码…

逆卷积(ConvTranspose2d)是什么?

上图是一个卷积操作&#xff08;蓝色为输入&#xff0c;绿色为输出&#xff09;。 输入的特征图为x&#xff1a;( 4&#xff0c;4 &#xff0c;channels_in&#xff09;其中channels_in表示通道数。 卷积核设置&#xff1a;无padding&#xff0c; kernel size为3*3&#xff0c…

<关键字(1)>——《C语言深度剖析》

目录 关键字 - 第一讲 1.关键字分类 2.定义与声明 2.1 什么是变量(是什么) 2.2如何定义变量(怎么用) 2.3为什么要定义变量(为什么) 2.4 变量定义的本质 2.5 变量声明的本质 3. 最宽宏大量的关键字 - auto 3.1 变量的分类 3.2 变量的作用域 3.3 变量的生命周期 …

汇编语言(第四版)第八章 实验7 习题解答

Power idea 公司从1975年成立一直到1995年的基本情况如下&#xff1a; 下面的程序中&#xff0c;已经定义好了这些数据&#xff1a; assume cs:codesg,ds:datasgdatasg segmentdb 1975,1976,1977,1978,1979,1980,1981,1982,1983db 1984,1985,1986,1987,1988,1989,1990,1991,19…

【12】C语言_几个循环的经典练习

目录 1. 打印n的阶乘; 2、计算 1!2!3!......10! 3、用二分查找在一个有序数组中查找一个数 4、打印如下 5、输入三次密码 6、写一个猜数字游戏 7、如题 8、打印1到100之间 3的倍数 9、给两个数&#xff0c;求出最大公约数 10、找出从1000到2000之间的闰年 11、找出10…

Java是编译性语言还是解释型语言 ?

首先我们应该了解这两种语言的概念 . 高级语言在计算机上执行 , 有两种方式 , 分为编译型语言和解释型语言 . 编译型语言 : 编写源代码–>编译–>链接. 典型的编译型语言 : C/C . 特点 : 源代码中一处有错 , 就不允许编译 ; 编译过程中出现一处错误 , 就停止编译 . 优…

论文投稿指南——中文核心期刊推荐(武器工业)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

4个免费数据恢复软件:免费恢复您的数据

意外的文件删除或文件损坏可能会令人头疼&#xff0c;尤其是在您不使用云存储的情况下。两者通常都支持已删除的文件恢复和版本控制&#xff0c;以帮助您摆脱此类困境。如果您不使用云&#xff0c;通常唯一的机会就是使用数据恢复软件来找回丢失或损坏的数据。 这种方法有两个…

使用 Burpsuite 测试的常用操作(二)

大家好啊&#xff0c;我是大田。接上篇文章「 使用 Burpsuite 测试的常用操作&#xff08;一&#xff09;」&#xff0c;今天继续分享一下 Burpsuite 在工作中常用操作三、本文中 2 个常用操作1、Burpsuite_proxy 篡改请求通过代理模式可以拦截、查看、修改所有客户端和服务器端…

(二)Linux嵌入式开发——软件安装(Ubuntu)

文章目录&#xff08;二)Linux嵌入式开发——软件安装&#xff08;Ubuntu&#xff09;APP StoreAPT工具问题解决办法1解决办法2deb软件包程序源码问题1解决办法问题2解决办法总结&#xff08;二)Linux嵌入式开发——软件安装&#xff08;Ubuntu&#xff09; 接下来&#xff0c;…

【GD32F427开发板试用】FOC矢量算法研究系列之一:PWM实现呼吸灯

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;Q_dGHvwj 前言 有幸被选为此次开发板测评活动的参与者&#xff0c;万分感谢。收到板子后迫不及待的拆来查看&#xff0c;画风整齐美观&#x…

SpringCloudAlibabaNacosConfig学习笔记

目录 1. Nacos配置中心使用 2 搭建nacos-config服务 3 Config相关配置 4 .配置的优先级 5. RefreshScope 1. Nacos配置中心使用 官方文档&#xff1a; https://github.com/alibaba/springcloudalibaba/wiki/Nacosconfig Nacos 提供用于存储配置和其他元数据的key/value 存…

23种设计模式(十三)——代理模式【接口隔离】

文章目录 意图什么时候使用代理真实世界类比代理模式的实现代理模式的优缺点亦称:Proxy 意图 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 什么时候使用代理 1、…

论文投稿指南——中文核心期刊推荐(环境科学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

操作系统-操作系统引论(1)

操作系统的基本概念一、操作系统的定义二、操作系统的产生与发展三、操作系统的特征四、操作系统的功能五、操作系统的运行机制六、操作系统的体系结构一、操作系统的定义 资源管理的观点&#xff1a;操作系统是控制和管理计算机的软、硬件资源&#xff0c;并且合理的组织计算…