一、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++标准模板库集合类与映射类总结的更多相关文章

  1. 如何导出标准模板库(STL)类的实例化和包含STL类对象数据成员的类

    本文翻译自 https://support.microsoft.com/zh-cn/help/168958/how-to-export-an-instantiation-of-a-standard-t ...

  2. C++——string类和标准模板库

    一.string类 1.构造函数 string实际上是basic_string<char>的一个typedef,同时省略了与内存管理相关的参数.size_type是一个依赖于实现的整型,是 ...

  3. C++标准模板库Stand Template Library(STL)简介与STL string类

    参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进 ...

  4. C++ primer plus读书笔记——第16章 string类和标准模板库

    第16章 string类和标准模板库 1. string容易被忽略的构造函数: string(size_type n, char c)长度为n,每个字母都为c string(const string ...

  5. 【c++】标准模板库STL入门简介与常见用法

    一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...

  6. STL标准模板库(简介)

    标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...

  7. 【转】C++标准库和标准模板库

    C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费 ...

  8. STL标准模板库介绍

    1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的 ...

  9. STL学习一:标准模板库理论基础

    STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的从广 ...

随机推荐

  1. leetcode解题报告(29):Student Attendance Record I

    描述 You are given a string representing an attendance record for a student. The record only contains ...

  2. 97: cf 983E 倍增+树套树

    $des$一棵 $n$ 个点的树,树上有 $m$ 条双向的公交线路,每条公交线路都在两个节点之间沿最短路径往返.$q$ 次询问从一个点要到达另一个点,在只坐公交的情况下,至少需要坐几辆公交车:或者判断 ...

  3. noi.ac #43 dp计数

    \(sol\) 状态 \[f_{i, dis_1, dis_2, dis_3, dis_4}\] 表示到了第 \(i\) 层,其中 \(dis_{1}\) 表示第一根柱子剩下的最靠上的横木到当前 \( ...

  4. [luogu 4719][模板]动态dp

    传送门 Solution \(f_{i,0}\) 表示以i节点为根的子树内,不选i号节点的最大独立集 \(f_{i,1}\)表示以i节点为根的子树内,选i号节点的最大独立集 \(g_{i,0}\) 表 ...

  5. SpringData :下划线的那些破事

    今天写一个查询语句的时候,报错如下 org.springframework.beans.factory.BeanCreationException: Error creating bean with ...

  6. [转载] 浏览器Browser对同域名下的请求并发数量

    原文链接:https://blog.csdn.net/a562550212/article/details/79552713 另附原文作者贴的一个知乎地址,几个答主讲的非常好  https://www ...

  7. springcloud config自动刷新中文乱码问题

    摘录一段网上盛传的,如下: 在使用 spring cloud config 时,如果在 properties 文件里面有中文的话,会出现乱码. 乱码的原因是:spring 默认使用org.spring ...

  8. T-MAX组--项目冲刺(第六天)

    T-MAX组--项目冲刺(第六天) THE SIXTH DAY 项目相关 作业相关 具体描述 所属班级 2019秋福大软件工程实践Z班 作业要求 团队作业第五次-项目冲刺 作业正文 T-MAX组--项 ...

  9. layer.msg如何让按钮的回调执行完毕后弹框不自动关闭

    问题出现:我点击“确定”时会验证“新手机号码”,如果验证不通过则不给该弹框关掉,但是实际操作时,不管验证怎么样,点击“确定”之后该弹框都会关掉. 之前的写法: layer.open({         ...

  10. Mysql中如何查看慢查询以及查看线程

    一.MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句 1,slow_query_log这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句. 2,long_query_time ...