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的从广 ...
随机推荐
- Luogu3774 [CTSC2017]最长上升子序列 【Young表,根号分治】
题目链接:洛谷 推荐阅读:2019年集训队论文<浅谈杨氏矩阵在信息学竞赛中的应用> 首先我们来看一个东西,叫做Young表. 它是长一个阶梯状的东西(行长和列长都是递减的),并且每一行和每 ...
- pve 导入 ova
匆忙记录 Proxmox includes qm importdisk as command. Extract your ova: tar -xvf *.ova Create a new VM wit ...
- Shell编程—企业生产案例
Linux系统Shell编程—企业生产案例(一) 企业数据库可以说是重点保护对象啊,没有之一,数据在当今企业里就是生命线,因此今天就来说一说,如何通过shell脚本来检查或监控MYSQL数据库服务是否 ...
- linux 9.故障修复和网络配置
一.linux系统故障修复 1.不知道root密码的前提下 破解root密码 服务器必须在身边 grub引导菜单 按任意键进入->e ( ...
- Linux静态路由配置
配置了多块网卡后,需要指定数据包由哪块网卡发送,否则可能无法访问内网,这就要用到静态路由了. 配置静态路由有多种方式: 1.修改 /etc/rc.local 文件,这样每次重启后就会自动添加,如: e ...
- linux系统下以存储从大到小并以K,M,G为单位的方式查看当前目录下的文件信息
zhuazai:https://blog.csdn.net/sty945/article/details/79830915 前言 ls命令 ls -a ls -l ll du命令 du -s du - ...
- 免费s账号网站
下面网址按排序顺序优先使用,数字越小优先级越高 1,https://io.freess.today/ 2,https://free-ss.site/ 3,https://ss.freess.org/ ...
- Qt动画框架The Animation Framework
动画框架是Kinetic(运动)项目的一部分,它的目标是提供一中简单的方法创建动画的和流畅的GUI.借助Qt动画属性,可以提供非常自由的动画窗体组件和其他对象(QObjects).动画框架也能被用于图 ...
- css3画半圆的两种方法
<html lang="en"> <head> <meta charset="UTF-8"> <meta name=& ...
- hue 登录访问不了HDFS webhdfs_url 调整
Cannot access: /. Note: you are a Hue admin but not a HDFS superuser, "hdfs" or part of HD ...