【C++自学笔记】STL-详细解析map、mulitmap(关联式容器)

一、关联式容器概念

1、关联式容器

关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存放的是<key,value>结构的键值对,在数据检索时比序列式容器效率更高。

2、键值对

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

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。这四种容器的共同点是:使用平衡二叉搜索树(即红黑树)作为其底层的结果,容器中的元素是一个有序的序列。

1、map

1、map的介绍

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

2、map的使用

void MapTest() {

	map<string, string> m;

	//插入数据
	m.insert(pair<string, string>("peach", "桃子"));
	m.insert(make_pair("banana","香蕉"));
	m["apple"] = "苹果";

	cout << m.size() << endl;
	//用迭代器去遍历 map 中的元素,可以得到一个按照 key 排列的序列
	for (auto x : m)
		cout << x.first << "--->" << x.second << endl;
	cout << endl;

	//map 中的键值对 key 是唯一的,如果 key 存在将插入失败
	auto ret = m.insert(make_pair("peach","桃子"));
	if (ret.second)
		cout << "<peach,桃子>不在map中,以及插入" << endl;
	else
		cout << "已存在,插入失败" << ret.first->first << "--->"
		<< ret.first->second << "failed" << endl;

	//删除 key 为"apple"的元素
	m.erase("apple");

	if (m.count("apple") == 1) {
		cout << "Have" << endl;
	}
	else
		cout << "Nohave" << endl;
}

operator[ ]的原理是:

用<key,value()>构造一个键值对,然后调用insert()函数将该键值对插入到 map中;

如果key 已经存在,插入失败,insert 函数返回该 key 所在位置的迭代器;

如果key 不存在,插入成功,insert 函数返回新插入元素所在位置的迭代器;

operator[ ]函数最后将insert 返回值是将键值对中的 value 返回;

扫描二维码关注公众号,回复: 8492234 查看本文章

3、map的总结

  • map 中的元素时以键值对的方式给出的;
  • map 中的key 是唯一的,并且不能进行修改;
  • 默认按照小于的方式对key 进行比较;
  • map 中的元素如果用迭代器去遍历,可以得到一个有序的序列;
  • map 的底层为红黑树,查找效率比较高 O(log2N)
  • 支持[ ]操作符,operator[ ]实际进行插入查找; 

2、multimap

1、multimap的介绍

multimap 基本上和 是一样的,唯一的不同是:map 中的 key 是唯一的,而 multimap 中 key 是可以重复的

2、multimap的使用

multimap 的接口参考 map,功能都是类似的;

3、multimap的总结

  • multimap中的key 是可以重复的;
  • multimap中的元素默认将 key 按照小于来比较;
  • multimap中没有重载 operator[ ]操作;
  • 使用时与 map 包含的头文件相同;

3、set

4、multiset

发布了79 篇原创文章 · 获赞 28 · 访问量 7761

猜你喜欢

转载自blog.csdn.net/weixin_43753894/article/details/100005659
今日推荐