之前学习过标准库,最近身边有人问到相关话题,故在此做一个总结

1 标准库介绍

  C++标准库:C++ Standard Library
  C++标准模板库:Standard Template Library(STL)

1.1 二者关系及表现形式

  1. 标准库是由编译器提供的(比如我们常见的VC,GCC...),STL属于标准库的一部分(占比绝大部分),标准库一定是包含(大于)STL的;
  2. 标准库引用形式:
    •   都是以头文件的形式提供不带.h,比如:#include<vector>;
    •   新式c头文件一般是:#include<cstdio>;
    •   命令空间:namespace std;

  引用方法:

 #include <iostream>
#include <cstdio> //snprintf()
#include <cstdlib> //RAND_MAX
#include <cstring> //strlen(), memcpy()
#include <string>
using namespace std;
using std::cin;
using std::cout;
using std::string;

1.2 STL六大部件

  以上的六大部件解释如下:

  1. 容器:容器就是我们存放数据的地方,相当于数据仓库,实现方式是类模板;
  2. 分配器:管理容器背后的内存使用,实现方式是类模板;
  3. 算法:常见的比如排序、查找等,实现方式是函数模板;
  4. 迭代器:算法操作容器的桥梁,是一种泛化的指针,实现方式是类模板;
  5. 仿函数:或者叫Function Object,它是一个类对象,其次它重载了()操作符,使用在自定义类对象时,比如我们对石头进行排序,在算法操作时就可以写一些仿函数供算法正确使用,实现方式时类模板;
  6. 适配器:相对于迭代器、仿函数、容器的数据转换,实现方式是类模板。

1.3 STL的简单使用

1.4 事间复杂度

  要讨论时间复杂度,其中n必须建立在足够大的工业数据基础上

1.5 STL中的区间表示法

   STL采用前闭后开区间表示数据的范围,所有的数据都是通过begin()和end()两个函数表示数据的范围,begin表示数据的头,end表示数据尾的下一个元素,也就是说,对end进行解引用操作得到的指针它是不确定的东西,也可能造成程序宕机或者其他不是你心里所想的东西。

2 容器分类

  容器分为序列式容器和关联式容器(分为有序和无序),红色部分是c++2.0引入的

序列式容器(Sequence Container):元素都是有序的,里面的空间可能是连续的,也可能是由指针一个个串起来的;

关联式容器(Associative Container):元素是由key和value组成的,当然用key能很快找value,适用于查找操作

2.1 序列式容器(Sequence Container)

2.1.1 Array

  对比于c语言的数组,标准库进行封装,初始化的时候就要确定大小,不能扩展(注意在栈上有大小限制,不同的机器内存限制不一样);

2.1.2 Vector

  一种可以动态扩充的数组,只能在容器的末端进行扩充,当容量不足时会自动扩充,扩充规则为当前空间的2倍,内存由Vector背后的分配器进行,使用者不用关心内存分配问题;

2.1.3 Deque

  双端队列,容器两端均可进行数据扩充;

2.1.4 List

  双向环状链表,内存占用比Forward_List多;

2.1.5 Forward_List

  单向链表,只能从尾部扩充。

2.2 关联式容器(Associative Container)-- 有序

  元素key是有序

2.2.1 Set/MultSet

  目前各大厂商编译器都是由红黑树(RBtree)实现,保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值,左右是高度平衡的防止某一个分支比较长,每个元素由key和value组成,set中key和value是同一个值,key和value是不分的,元素不可重复,当重复放入时容器会反弹回来;

  MultSet表示元素可以重复。

2.2.2 Map/Multimap

  目前各大厂商编译器也都是由红黑树实现,区别于set,每个元素分为key和value,同样元素不可重复,当重复放入时容器会反弹回来;

  Multimap表示元素可重复,也就是key-value可重复。

2.3 无序容器(Unordered Container)-- 无序

  元素的key是无序的;

  Unordered set和Unordered  map底层是由哈希表(Hashtable)实现,用哈希表必然存在元素碰撞问题,所以各大编译器都采用Separate Chaining哈希表。

C++标准库分析总结(一)的更多相关文章

  1. C++标准库分析总结(三)——<迭代器设计原则>

    本节主要总结迭代器的设计原则,以及iterstor traits的设计作用 1.迭代器遵循的原则 迭代器是算法和容器的桥梁,它是类模板的设计,迭代器必须有能力回答算法提出的问题才能去搭配该算法的使用 ...

  2. golang标准库分析之net/rpc

    net/rpc是golang提供的一个实现rpc的标准库.

  3. C++标准库分析总结(八)——<仿函数、适配器、istream_iterator、ostream_iterator、bind>

    一.仿函数定义 仿函数是STL中最简单的部分,存在的本质就是为STL算法部分服务的,一般不单独使用.仿函数(functors)又称为函数对象(function objects),虽然函数指针虽然也可以 ...

  4. C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

    本节主要总结标准库Deque的设计方法和特性以及相关迭代器内部特征 1.Deque基本结构 Deque(双向队列)也号称连续空间(其实是给使用者一个善意的谎言,只是为了好用),其实它使用分段拼接起来的 ...

  5. C++标准库分析总结(四)——<Vector、Array、Forward_list设计原则>

    本节主要总结标准库Vector和Array的设计方法和特性以及相关迭代器内部特征 1.Vector 1.1 Vector 内部实现 Vector是自增长的数组,其实在标准库中没有任何一种容器能原地扩充 ...

  6. C++标准库分析总结(九)——<HashFunction、Tuple>

    一.HashFunction 当我们在使用hash table以及由它做底层的数据结构时,我们必不可少要讨论hash function,所谓的哈希函数就是产生一个数,这个数越乱越好,以至于达到避免碰撞 ...

  7. C++标准库分析总结(七)——<Hashtable、Hash_set、Hash_multiset、unordered容器设计原则>

    编译器对关联容器的实现有两个版本,上一节总结了以红黑树做为基础的实现版本,这一节总结以哈希表(hash table,散列表)为底部结构的实现版本. 一.Hashtable简单介绍 Hashtable相 ...

  8. C++标准库分析总结(六)——<Map、Multimap、Set、Multiset设计原则>

    关联容器我们可以看做是一个小型的数据库,它就是用key找value,编译器底层对于关联容器的实现有两种:红黑树(Red-Block tree)和哈希表(hash table,散列表). 一.红黑树简单 ...

  9. C++标准库分析总结(二)——<模板,分配器,List>

    本节主要总结模板及其类模板分类以及STL里面的分配器.容器内部结构以及容器之间的关系和分类,还介绍了容器中List的结构分布 1.源代码版本介绍 1.1 VC的编译器源码目录: 2.类模板 2.1 类 ...

随机推荐

  1. C#用户控件实战01_CSS布局

    很多应用系统的主页布局,一般采用如下案例所示布局较多,如下图的CSS布局框架,上.中.下,接下来我们演示,在C#中实现如下的业务架构布局. 代码范例: 在<body></body&g ...

  2. 测试人员必须掌握的linu常用命令

    有些公司需要测试人员部署程序包,通过工具xshell. 现在我将总结下工作需要用到的最多的命令 ls                                显示文件或目录 pwd       ...

  3. H5之拖拽

    步骤: 1.为将要拖拽的元素设置允许拖拽,并赋予dragstart事件将其id转换成数据保存: 2.为容器添加dragover属性添加事件阻止浏览器默认事件,允许元素放置,并赋予drop事件进行元素的 ...

  4. vscode教程(基础篇)

    转载:https://segmentfault.com/a/1190000017949680 本文主要介绍vscode在工作中常用的快捷键及插件,目标在于提高工作效率 本文的快捷键是基于mac的,wi ...

  5. win10 下的anaconda3 安装(2019.06.04最新)

    最近电脑重装系统后,安装anaconda 发现有一些新的变动,容易出现一些新的问题,现在记录下来.(现在根据清华镜像的最新公告,清华anaconda 已经恢复,可以直接换成清华镜像的源了) 1 安装 ...

  6. 基本代码、插值表达式、v-cloak

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 【SpringMVC】统一异常处理

    一.需求 二.统一异常处理解决方案 2.1 定义异常 2.2 异常处理 2.3 配置统一异常处理器 2.4 异常处理逻辑 一.需求 一般项目中都需要作异常处理,基于系统架构的设计考虑,使用统一的异常处 ...

  8. 深入浅出Git(偏向理论)

    目录 一.理论概述 1. 什么是Git 版本控制系统分类 2. GitLab和GitHub是什么 3.Git功能 二.结合具体命令了解其工作 1.环境 2.部署 Git仓库的使用 简单命令解释 Git ...

  9. 算法学习:我终于明白二分查找的时间复杂度为什么是O(logn)了

    最近发现了个好东西,就是一个学算法的好东西,是网易公开课的一个视频. 直通车 这是麻省理工学院的公开课,有中英字幕,感谢网易.. 也可以在App把视频缓存下来之后再放到电脑上面看,因为我这样可以倍速, ...

  10. IPC——概述

    现代操作系统下的内存 现在的OS都引入了虚拟内存机制.我们说的内存空间,实际上虚拟内存空间,CPU执行PC指向的命令,PC指向的就是虚拟内存空间地址.虚拟内存机制只不过是OS为我们做了一层虚拟内存地址 ...