STL:是Standard Template Library的简称,中文译为标准模板库,是由惠普实验室开发的一系列软件的统称,现为C++的一部分,可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)和仿函数(functors)六部分,本文只简单阐述容器部分。

  在C++标准中,STL被组织为下面的17个头文件:<algorithm>、<deque>、<functional>、<iterator>、<array>、<vector>、<list>、<forward_list>、<map>、<unordered_map>、<memory>、<numeric>、<queue>、<set>、<unordered_set>、<stack>和<utility>,容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成。

  容器分两大类:

  一、顺序容器:元素在顺序容器中的顺序与其加入容器时的位置相对应。

  标准库中的所有顺序容器都提供了快速访问元素的能力,但这些容器在一下方面都有不同的性能折中:

    (1)向容器中添加或从容器中删除元素的代价

    (2)非顺序访问容器中元素的代价

  1、顺序容器类型

    (1)vector:可变大小数组,支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。

    (2)deque:双端队列。支持快速随机访问。在头尾位置插入或删除速度很快。

    (3)list:双向链表。只支持双向顺序访问。在list中任何位置进行插入或删除操作速度都很快。

    (4)forward_list:单向链表。只支持单向顺序访问。在链表任何位置进行插入或删除操作速度都很快。

    (5)array:固定大小的数组。支持快速随机访问。不能添加或删除元素。

    (6)string:与vector相似的容器,但专门用于保存字符。随机访问快,在尾部插入或删除速度快。

  2、顺序容器的选择

    通常,vector是最好的选择,除非有很好的理由选择其他容器。一下是选择容器的基本原则:

    (1)除非有很好的理由选择其他容器,否则应使用vector。

    (2)如果你的程序有很多小的元素,且空间的额外开销很重要,则不要使用list或者forward_list。

    (3)如果程序要求随机访问元素,应使用vector或者deque。

    (4)如果程序要求在容器中间插入或删除元素,应使用list或forward_list。

    (5)如果程序要求在容器头尾位置插入或删除元素,但不会在中间位置插入或删除元素,则使用deque。

    (6)如果程序只有在读取输入时需要在容器中间位置插入元素,随后需要随机访问元素,则

      ----首先,确定是否真的需要在容器中间位置插入元素。当处理输入数据时,通常可以很容易的向vector中追加数据,然后再调用标准库中的sort函数来重排容器中的元素,从而避免在中间位置添加元素。

      ----如果必须在中间位置插入元素,考虑在输入阶段使用list,一旦输入结束,将list中的内容拷贝到一个vector中。

  

  二、关联容器:关联容器中的元素是按关键字来保存和访问的。关联容器支持高效的关键字查找和访问,主要的两个关联容器:map和set。

    map:其中的元素是一些关键字-值(key-value)对,关键字起到索引的作用,值表示与索引相关联的数据。

    set:每个元素只能包含一个关键字,支持高效的关键字查询操作----检查给定的关键字是否在set中。

    1、标准库中提供了8个关联容器。这8个容器的不同体现在三个维度上:

    (1)每个容器或是一个map,或是一个set

    (2)或要求不重复关键字,或要求重复关键字

    (3)按顺序保存,或者无序保存。

    按关键字有序保存的元素:

    map:关联数组;保存关键字-值

    set:关键字即值,即只保存关键字的容器

    multimap:关键字可重复的map

    multiset:关键字可重复的set

    无序集合:

    unordered_map:用哈希函数组织的map

    unordered_set:用哈希函数组织的set

    unordered_multimap:哈希组织的map,关键字可重复出现

    unordered_multiset:哈希组织的set,关键字可重复出现

查漏补缺:C++STL简述(容器部分)的更多相关文章

  1. 半夜思考之查漏补缺, Spring 中的容器后处理器

    之前学 Spring 的时候 , 还没听过容器后处理器 , 但是一旦写出来 , 就会觉得似曾相识 . 容器配置器通常用于对 Spring 容器进行处理 , 并且总是在容器实例化任何其他 Bean 之前 ...

  2. 【spring源码分析】IOC容器初始化——查漏补缺(四)

    前言:在前几篇查漏补缺中,其实我们已经涉及到bean生命周期了,本篇内容进行详细分析. 首先看bean实例化过程: 分析: bean实例化开始后 注入对象属性后(前面IOC初始化十几篇文章). 检查激 ...

  3. Entity Framework 查漏补缺 (一)

    明确EF建立的数据库和对象之间的关系 EF也是一种ORM技术框架, 将对象模型和关系型数据库的数据结构对应起来,开发人员不在利用sql去操作数据相关结构和数据.以下是EF建立的数据库和对象之间关系 关 ...

  4. 查漏补缺&#183;补丁计划

    趁着神志清醒赶紧写一下. 多次考试暴露出各种问题.新的知识点先不去搞了,最近多做一些不擅长的类型的题查漏补缺一下吧. 唔,首先是比较考验思维的类型,我智商太低又刷题少不会什么套路,只能最近赶紧赶一下进 ...

  5. CSS基础面试题,快来查漏补缺

    本文大部分问题来源:50道CSS基础面试题(附答案),外加一些面经. 我对问题进行了分类整理,并给了自己的回答.大部分知识点都有专题链接(来源于本博客相关文章),用于自己前端CSS部分的查漏补缺.虽作 ...

  6. 《CSS权威指南》基础复习+查漏补缺

    前几天被朋友问到几个CSS问题,讲道理么,接触CSS是从大一开始的,也算有3年半了,总是觉得自己对css算是熟悉的了.然而还是被几个问题弄的"一脸懵逼"... 然后又是刚入职新公司 ...

  7. js基础查漏补缺(更新)

    js基础查漏补缺: 1. NaN != NaN: 复制数组可以用slice: 数组的sort.reverse等方法都会改变自身: Map是一组键值对的结构,Set是key的集合: Array.Map. ...

  8. 2019Java查漏补缺(一)

    看到一个总结的知识: 感觉很全面的知识梳理,自己在github上总结了计算机网络笔记就很累了,猜想思维导图的方式一定花费了作者很大的精力,特共享出来.原文:java基础思维导图 自己学习的查漏补缺如下 ...

  9. 20165223 week1测试查漏补缺

    week1查漏补缺 经过第一周的学习后,在蓝墨云班课上做了一套31道题的小测试,下面是对测试题中遇到的错误的分析和总结: 一.背记题 不属于Java后继技术的是? Ptyhon Java后继技术有? ...

  10. 今天開始慢下脚步,開始ios技术知识的查漏补缺。

    从2014.6.30 開始工作算起. 如今已经是第416天了.不止不觉.时间过的真快. 通过对之前工作的总结.发现,你的知识面.会决定你面对问题时的态度.过程和结果. 简单来讲.知识面拓展了,你才干有 ...

随机推荐

  1. Python基础学习四

    Python基础学习四 1.内置函数 help()函数:用于查看内置函数的用途. help(abs) isinstance()函数:用于判断变量类型. isinstance(x,(int,float) ...

  2. goweb-访问数据库

    访问数据库 对许多Web应用程序而言,数据库都是其核心所在.数据库几乎可以用来存储你想查询和修改的任何信息,比如用户信息.产品目录或者新闻列表等. Go没有内置的驱动支持任何的数据库,但是Go定义了d ...

  3. Educational Codeforces Round 64(Unrated for Div.1+Div. 2)

    什么垃圾比赛,A题说的什么鬼楞是没看懂.就我只会BD(其实C是个大水题二分),垃圾游戏,技不如人,肝败吓疯,告辞,口胡了E就睡觉了. B 很容易发现,存在一种方案,使得相同字母连在一起,然后发现,当字 ...

  4. UUID与时间戳

    /** * 32位去除'-'的UUID */ public static String getUUID() { String uuid = java.util.UUID.randomUUID().to ...

  5. 109)PHP与oracle网址

    https://pecl.php.net/package/oci8/2.1.8/windowshttps://www.toadworld.com/platforms/oracle/w/wiki/116 ...

  6. day42-进程池

    #进程池Pool:apply apply_async-close-join-get map callback #1.进程池Pool:执行下面代码发现任务012先执行,345后执行,因为进程池只有3个进 ...

  7. xshell+xftp将项目部署到远程服务器上

    Xshell 简介: Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议. Xshell 通过互联网到远程主机的 ...

  8. 聊聊HTTPS和SSL/TLS协议 【基础入门】

    要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识.1. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义2. 大致了解 HTTP 和 TCP 的关系(尤其是“短连接”VS“长连接 ...

  9. 吴裕雄--天生自然python学习笔记:python文档操作自动查找替换 Word 文件中的指定文字

    Win32com 组件提供了自动替换 Word 文件中指定文字 的功能 .在使用“查找” 功能替换文字之前,可先清除源文字及目标文字的格式,以免影响替换效果,语法为 : 替换 Word 文件特定文字的 ...

  10. python数据类型:列表List和Set

    python数据类型:列表List, Set集合 序列是Python中最基本的数据结构 序列中每个元素都分配一个数字,表示索引 列表的数据项不需要具有相同的类型        列表中的值可以重复并且有 ...