C++轮子 · STL关联容器

这篇具有很好参考价值的文章主要介绍了C++轮子 · STL关联容器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一篇文章中我们简单的介绍了一下STL中的序列容器和容器适配器,这篇文章中我们将重点介绍STL中的关联容器(最后四个在概念上应该不是关联容器,但是因为和前面的容器联系太紧密,统一放在这里讲解),主要内容包括:

  • std::set
  • std::map
  • std::multi_map
  • std::multi_set
  • std::unordered_map
  • std::unordered_set
  • std::unordered_multimap
  • std::unordered_multiset

std::set

通常提到关联容器,大家可能首先会想到的是std::map,这里先讲解std::set是避免出现关联数组关联容器概念上的混淆。前者是数据结构中的概念,而后则是C++中特有的概念。

什么关联容器

关联容器这个概念,在C++里面是一个Concept(关于concept的讨论我们在上一篇文章中有讲解,这里不再赘述),它的基本定义如下:

An AssociativeContainer is an ordered Container that provides fast lookup of objects based on keys.

翻译成中文,大概是说关联容器是提供了基于key的快速查找功能的有序容器。它实际上是 Container 这个 Concept 的 Refinement。

Refinement

Refinement 在泛型编程中是一个非常重要的概念,它和 Concept 的关系类似于OO世界中父子继承关系。我们知道 Concept 表示的不是一个类型而是一个类型集合,所以 Refinement 表示的其实也是一个类型集合,这些类型比 Concept 中的定义的类型要有更多的约束和特性(约束和特性其实是一个问题的两个方面,你约束的越是严格,你能够使用的特性越多,但是你能使用的场景越少,比如 Java 中 Object 类哪儿都能用,又哪儿都用不了)。

有序

在数学概念上,集合表示具有某种特定性质的事物的总体,它有三个特性:无序性、互异性、确定性。

个人认为,C++世界里面的std::set其实并不是传统意义上的集合,因为它不符合无序的特性(当然你也可以理解成无序表示任何顺序都可以,有序也属于无序的一种状态)。

Key 值的只读属性

需要特别提醒的是,因为关联容器使用key值排序,你不能修改key值,否则你会破坏关联容器的内部结构(虽然有些情况下更改key值在逻辑上是合理并且合法的【1】)。在C++11之后,关联容器返回的迭代器,key都默认是const。如果你需要更改key的值,最好的方式是先删除,再插入(有move的存在,这一步的开销相对小一些)。

互异

互异是指集合内部的任意两个元素都不相同,这一点在std::set中满足,但是在std::multi_set中并不满足。

std::set元素的互异在编程中有一个非常大的作用是去重,当然你也可以使用sort+unique的方式来处理去重,但是std::set的方式在逻辑上更具有表达力。

成员方法

std::set中的很多成员和std::map类似,只不过它们的value_type不一样,std::set<std::string>value_typestd::string,而std::map<int, std::string>value_typestd::pair<const int, std::string>。因此这一小节不介绍相关的成员函数,你可以查看std::map的相关成员函数的介绍,然后对照std::set的文档来理解这一部分内容。

std::map

std::map可能是C++世界使用得最广泛的关联容器,它以键值对的形式存储数据的一种关联容器,可以用于充当关联数组。

关联数组

在数据结构的范畴里面,map又被称为关联数组。一个普通的数组,可以使用int(严格来说应该是size_t)做为下标来访问数组内部的元素,关联数组则可以使用任意类型做为下标来存取数组内部的数组。当然这里说的数组是一个逻辑上的概念,关联数组的实现物理上的实现通常是树或者哈希表等等。

需要注意的是关联数组和关联容器是完全不同的两个概念,关联容器强调的是提供快速访问的有序容器,这个概念只存在于C++中;而关联数组强调的是键值对的形式存储数据,并通过key来快速访问数据,这个概念是传统数据结构中的概念,在不同的语言对应不同的类型,比如Java的map,Python的dict。关联容器不一定是关联数组,比如set;关联数组也不一定是关联容器,比如unordered_map。

红黑树

map和set的实现通常是一个颗红黑树,红黑树是一种平衡二叉排序树。它的节点要么是黑要么是红,但是文章来源地址https://www.toymoban.com/news/detail-812141.html

到了这里,关于C++轮子 · STL关联容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】unordered 系列关联式容器

    在 C++ 98 中,STL 提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 l o g 2 N log_2 N l o g 2 ​ N ,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是:进行很少的比较次数就能将元素找到,因此在 C++ 11 中,STL 又

    2024年04月11日
    浏览(25)
  • C++ STL set容器

    和 map、multimap 容器不同,使用 set 容器存储的各个键值对,要求键 key 和值 value 必须相等。 举个例子,如下有 2 组键值对数据: {\\\'a\\\', 1, \\\'b\\\', 2, \\\'c\\\', 3} {\\\'a\\\', \\\'a\\\', \\\'b\\\', \\\'b\\\', \\\'c\\\', \\\'c\\\'} 显然,第一组数据中各键值对的键和值不相等,而第二组中各键值对的键和值对应相等。对于 set 容器来

    2024年02月02日
    浏览(30)
  • C++之STL顺序容器

    目录 一、STL容器简介 二、顺序容器   STL容器是一个通用的数据结构,可以处理不同数据类型,包含基本的数据结构如 链表、堆栈、队列 等。可以分为 顺序容器、关联容器、 容器适配器、特殊容器 。本篇博客将简要介绍一下STL容器中的顺序容器。 2.1.特点: • 元素的添加

    2024年02月02日
    浏览(28)
  • C++提高编程——STL:string容器、vector容器

    本专栏记录C++学习过程包括C++基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下, 不定时更新,欢迎关注 。 当前章节处于: ---------第1阶段-C++基础入门 ---------第2阶段实战-通讯录管理系统, ---------第3阶段-C++核心编程, -----

    2024年01月23日
    浏览(35)
  • C++ [STL容器适配器]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT 前面我们介绍了适配器模式中的反向迭代器,反向迭代器通过容器所支持的正向迭代器适配为具有反向迭代功能的迭代器,本节我们介绍STL中另一种适配器: 容器适配器 ! 前面我们提到过STL适配器模式,关于适配器的解释: S

    2024年02月11日
    浏览(33)
  • C++标准库STL容器详解

    容器都是类模板,它们实例化后就成为容器类。用容器类定义的对象称为容器对象。对象或变量插入容器时,实际插入的是对象或变量的一个复制品。 顺序容器 1、元素在容器中的位置同元素的值无关,即容器不是排序的。 2、顺序容器包括:vector、deque、list。 关联容器 1、

    2024年02月10日
    浏览(23)
  • C++ [STL容器反向迭代器]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT 我们知道STL大部分容器都有迭代器,迭代器又分为正向迭代器和反向迭代器,对于正向迭代器以及实现前面我们已经了解了不少,而反向迭代器的设计思想是 适配器模式 ,本节我们介绍反向迭代器的实现! 适配器是把一个类的接

    2024年02月11日
    浏览(46)
  • 【C++学习】STL容器——list

    目录 一、list的介绍及使用 1.1 list的介绍  1.2 list的使用 1.2.1 list的构造  1.2.2  list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list 迭代器失效 二、list的模拟实现 2.1 模拟实现list 三、list和vector的对比 一、list的介绍及使用 1.1 list的介绍 list的文档介绍

    2024年02月14日
    浏览(30)
  • C++:关联式容器:unordered_map

    目录 1.unordered_ map特性 2. 常用接口的使用 1.insert          2.find 3.erase ​4.operator[ ]  3.迭代器的有效性 1. unordered_map是存储key, value键值对的关联式容器,其允许通过keys快速的索引到与 其对应的value。 2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,

    2024年02月09日
    浏览(29)
  • 【C++关联式容器】unordered_map

    目录 unordered_map 1. pair类型 2. 关联式容器额外的类型别名 3. 哈希桶 4. 无序容器对类型的要求 5. Member functions 5.1 constructor、destructor、operator= 5.1.1 constructor 5.1.2 destructor 5.1.3 operator=  5.2 Capacity ​5.2.1 empty 5.2.2 size 5.2.3 max_size 5.3 Iterators 5.4 Element access 5.4.1 operator[] 5.4.2 at 5

    2024年02月22日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包