<stl系类> map和set详解,掌握stl容器从现在开始

本文详细介绍了STL中的关联式容器,包括map和set的概念和使用。阐述了set和multiset的区别,以及map与multimap的特性。重点讲解了set的插入、遍历、查找和删除,以及map的插入、遍历、修改数据和统计次数的方法。文章以实例演示了如何操作这些关联式容器,帮助读者深入理解STL中的键值对存储结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、关联式容器

1、关联式容器概念

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

二、set与multiset

1.set的介绍

2.set的使用

2.1set的插入与遍历

2.2 set的查找与删除

3、multiset的介绍与使用

3.1 multiset的遍历

3.2 multiset的查找

3.3 multiset的删除

 三、map和multimap

1、map的介绍

2、map的使用 

2.1map的插入

2.2map的遍历

 2.3通过map的迭代器修改数据

2.4 统计次数

 2.5 [ ]的扩展学习

3、multimap

总结


前言

哈喽,小伙伴们大家好。今天我们继续来学习STL容器,今天我将主要介绍map和set的使用。话不多说,拿好小本本,我们赶快开始吧。


一、关联式容器

1、关联式容器概念

在之前我们接触过STL的部分容器,比如vector,deque,list。这些容器统称为序列式容器,底层为线性结构,存储的是元素本身。那什么是关联式容器呢?

关联式容器也是用来存储数据的,与序列式容器不同的是,关联式容器中存储的<key,value>结构的键值对,有助于数据检索。键值对是一种一一对应的结构,key代表键值,value代表键值所对应的信息。英汉互译词典利用的就是这种结构,即中文和英文一一对应,通过英文就能找到对应的中文。

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

根据应用场景不同,STL创建了两种关联式容器,分别是树形结构和哈希结构,今天我们主要学习树形结构的容器。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。

二、set与multiset

1.set的介绍

  • set是按照一定次序存储元素的容器,set中插入元素时,只需要插入value即可,不需要构造键值对。但在底层实际存放的是由<value, value>构成的键值对。
  • 在set中,并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
  •  set中的底层使用二叉搜索树(红黑树)来实现。

2.set的使用

2.1set的插入与遍历

在插入过程中,遇到重复的值会自动跳过。遍历时借助迭代器,迭代器采用的是树结构的中序遍历,这样遍历出来的数据是有顺序的。

void test_set1()
{
	set<int> s;
	s.insert(3);
	s.insert(1);
	s.insert(2);
	s.insert(14);
	s.insert(36);
	s.insert(4);
	s.insert(3);
	s.insert(3);
    // 遍历方式1:
	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		// 不能修改已经插入的值
		// *it += 1;
        cout << *it << " ";
		++it;
	}
	cout << endl;
    // 遍历方式2:
	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;
}

2.2 set的查找与删除

查找会返回特定值对应位置的迭代器。如果没有找到则返回尾部的迭代器。删除通常有两种方式,通过值删除或通过查找到的位置删除。

区别是通过值删除,如果要删除的值没在set中则不处理,也不会报错。而通过查找位置删除,如果找不到还依旧删除则会报错。

void test_set2()
{
	set<int> s;
	s.insert(3);
	s.insert(1);
	s.insert(2);
	s.insert(14);
	s.insert(36);
	s.insert(4);
	s.insert(3);
	s.insert(3);

	// 先查找,找到了再删。没找到,也去删会报错
	auto pos = s.find(4);
	if (pos != s.end())
	{
		s.erase(pos);
	}

	pos = s.find(40);
	//s.erase(pos);
	if (pos != s.end())
	{
		s.erase(pos);
	}

	// 在就删除,不在就不处理也不报错
	s.erase(3);
	s.erase(30);
}

3、multiset的介绍与使用

multiset与set的唯一区别是允许键值冗余,可以存储相同的数据,在插入时会统一插入到相同值的右边或最左边,依然保持着大小关系。除了下面几点外,其它与set几乎没有区别。

3.1 multiset的遍历

如果multiset中有相同的值,在遍历时会遍历多次。

void test_set3()
{
	multiset<int> s;
	s.insert(3);
	s.insert(1);
	s.insert(2);
	s.insert(14);
	s.insert(36);
	s.insert(4);
	s.insert(3);
	s.insert(3);
	s.insert(3);

	// 排序
	multiset<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值