C++标准模板库集合类与映射类总结
一、STL集合类
标准模板库向程序员提供了一些容器类,以便在应用程序中频繁而快速的搜索。std::set和std::multiset用于存储一组经过排序的元素,其查找元素的复杂度为对数,而unordered集合的插入和查找时间是固定的。
容器set和multiset快速查找键,键是存储在一维容器中的值,multiset可存储重复的键值,而set不行。STL容器是泛型模板类,可用于存储字符串、整型、结构或对象。
为了实现快速搜索,STL set和multiset内部结构类似二叉树,将元素插入到set时对其进行排序。
实例化
实例化的方法跟其他类型的容器类似,而访问的方法也可以声明一个迭代器。对于插入元素排序,如果没有提供排序标准,它将使用默认谓词std::less,确保元素升序排列。要创建二元排序谓词,可在类中另一个operator(),让它接受两个参数,其类型与容量中存储的数据类型相同,并根据排序标准返回true。然后在实例化set或multiset时指定该谓词。
举例如下:
set<int> SetIntegers1;
set<int, SortDescending<int>> SetIntegers2;
第一个是最简单的实例化,省略了除类型外的其他所有模板参数,这导致使用默认排序谓词,即std::less<T>,如果要覆盖这种默认行为,则需要具体化另一个谓词模板,即使用指定的排序标准SortDescending来进行具体化set模板类的第二个模板参数。
插入元素
大多数容器都实现了成员函数insert,用法都类似。令使用count可以返回在multiset中存储指定元素的个数。
查找元素
关联容器大都实现了成员函数find(),根据提供的键值查找值。返回值为指向该元素对应的迭代器。对于multiset来讲,返回第一个与给定键值匹配的元素。如果没有找到,则返回对应的容器的.end()迭代器。
删除元素
erase函数,能够根据键删除值,还可以根据迭代器的范围来删除set或multiset中的值
小结:
针对频繁查找的情形使用set或multiset会合适,将对象存储在set或multiset中时要注意实现运算符<和==,前者提供排序谓词,后者提供find等函数。在需要频繁插入而不是频繁查找的情况下,最好使用list而不是set。
二、STL映射类
STL映射类map和multimap是键值对容器,支持根据键进行查找,与set和multiset类似,内部结构类似二叉树,在插入时排序。
实例化
要实例化将整数用作键、将字符用作map或multimap,必须具体化模板类std::map或multimap,实例化模板类map时,需要指定键和值的类型以及可选的谓词(帮助map类对插入的元素进行排序)。因此,典型的map实例化语法如下:
#include<map>
using namespace std;
map<keyType valueType, Predicate=std::less <keyType> > mapObject;
multimap<keyType valueType, Predicate=std::less <keyType> > mapObject;
第三个模板参数是可选的,如果指定了键和值的类型,而省略了第三个模板参数,将默认使用std::less用作排序标准。
指定排序谓词的方法所有的容器大致相同。
插入元素
insert,因为这种容器包含的元素都是键值对,因此可以使用std::pair来指定要插入的键、值:mapIntToString.insert(pari(-1, "Minus One"));还可以使用类似数组的语法[]进行操作,比如等效的形式为mapIntToString[-1] = "Minus One";[]内为键,=右边为值。
查找元素
find,根据给定的键来查找值,返回迭代器。首先应当检查迭代器是否查找到,再利用迭代器进行访问。如果没有查到,返回的迭代器指向容器末尾。而使用迭代器访问时,first返回的是键,而second返回的是值。
对于multimap,容器中可能包含多个键相同的键值对,因此需要找到与指定键对应的所有值,为此,可使用count来确定多少个值与指定的键对应,在对迭代器进行递增,以访问这些相邻的值。迭代器此时返回的是第一个键值对。
删除元素
erase,类似set和multiset。提供了使用键、迭代器和迭代器范围来删除元素。
小结:
需要存储键值对而且键是唯一的时,使用map,而键可重复时(比如电话簿)可使用multimap。与其他容器一样,都用成员函数size,指出容器中键值对的个数。
C++标准模板库集合类与映射类总结的更多相关文章
- 如何导出标准模板库(STL)类的实例化和包含STL类对象数据成员的类
本文翻译自 https://support.microsoft.com/zh-cn/help/168958/how-to-export-an-instantiation-of-a-standard-t ...
- C++——string类和标准模板库
一.string类 1.构造函数 string实际上是basic_string<char>的一个typedef,同时省略了与内存管理相关的参数.size_type是一个依赖于实现的整型,是 ...
- C++标准模板库Stand Template Library(STL)简介与STL string类
参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进 ...
- C++ primer plus读书笔记——第16章 string类和标准模板库
第16章 string类和标准模板库 1. string容易被忽略的构造函数: string(size_type n, char c)长度为n,每个字母都为c string(const string ...
- 【c++】标准模板库STL入门简介与常见用法
一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...
- STL标准模板库(简介)
标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...
- 【转】C++标准库和标准模板库
C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费 ...
- STL标准模板库介绍
1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的 ...
- STL学习一:标准模板库理论基础
STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的从广 ...
随机推荐
- DEV C++的使用
1.点击dev图标: 2.左上角点击:文件——新建——源代码(快捷键ctrl+N): 3. 然后开始写代码: 4.点击运行: 右边的那个编译加运行(点这个),左边编译,中间运行. 5.保存(可以修改保 ...
- rpm命令是RPM软件包的管理工具
rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐受到其他发行版的采用.RPM ...
- shell脚本编程基础之文件测试
文件测试判断条件 -e FILE:测试文件是否存在 -f FILE:测试文件是否为普通文件 -d FILE:测试指定路径是否为目录 -r FILE:测试当前用户对指定文件是否有读权限 -w FILE: ...
- 第02组 Alpha冲刺(2/6)
队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 任务分配.进度监督 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们尽快完成各自的进度 还剩下哪些任务 ...
- 【CSP模拟赛】Adore(状压dp 二进制)
题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...
- 微软校园招聘 研发工程师A
1.const A. const int a; B. int const a; a是常数 C. int const *a; D. const int *a; 常量指针,指向一个常量的指针 E. int ...
- 三大框架 之 Hibernate框架概述(概述、配置、核心API)
目录 Hibernate框架概述 什么是框架 hibernate简介(JavaEE技术三层架构所用到的技术) hibernate是什么框架 ORM hibernate好处 Hibernate基本使用 ...
- Java初级黄金体验 其一
关于作者 作者背景:公元2001年,意大利那不勒斯少年,为了达成梦想,在国庆的三天发现自己替身能力Java.从而加入了黑手党组织,并成为...... 作者目的:入门Java 为了Fighting Go ...
- 常用的maven仓库地址
maven 仓库地址: 共有的仓库http://repo1.maven.org/maven2/http://repository.jboss.com/maven2/http://repository. ...
- TP5 分页数据加锚点
TP5 分页数据加锚点跳转到相应位置 有这样一个需求,就是加载评论后,点下一页的时候回到相应的位置. $comment = Db('comment')->order('addtime' ...