一、STL六大部件

  容器(Containers):存放元素,内存由分配器搞定

  分配器(Allocator):支持容器的内存分配

  算法:操作容器元素的函数。与OO不同(面向对象将元素与函数放到一个类里),GP(模板编程)将数据放入容器,操作方法放入算法中。

  迭代器(Iterator): 算法和容器之间的桥梁,通过迭代器,算法才能去操作容器中的元素。迭代器就是泛化的指针。

  适配器(Adapters):对其他组件进行转换。

  仿函数(Functors):自定义类的相关操作(比如自定义类A,计算其两个实例的相加、相减等,即操作符重载)。

二、一个例子使用六大部件

  通常allocator那部分不用写。

三、容器遍历

  前闭后开区间

  

  使用auto,for遍历

  

  auto的其他用法

   

四、容器结构与分析

  1、顺序容器

  Array:固定大小,连续空间存放

  Vector: 当容量不够时,allocator在背后重新分配

  Deque: 双端队列

  List: 双向链表

  ForwardList:单向链表

  

  2、关联容器(包括Unordered_Containers)

  

  关联容器的查找很快

  Map/Set:一般用红黑树实现(左右高度平衡的二叉树)

  MultiMap/MultiSet: key可重复的。

  Map是key-value,Set是key-key。

  无序容器:元素存放的位置是不固定的,由hash-table实现(目前最好的实现方式是seperate chaining)。

五、容器使用

  1、编码习惯

     (1)为每个独立的程序创建namesapce;

     (2)  在用到变量时才定义变量,但不缩进;

  2、vector

    (1)因为单向,只能通过push_back存放元素(从头存放需要移动整个vector);

    (2)   当空间不足,重新分配内存时,内存两倍增长;

    (3)可以通过front,back访问首尾元素,data访问首地址(vector, array, list);

  3、List

     标准库有sort,各个容器也有自带sort,排序尽量用自带的sort。每次扩充一个结点,空间利用率高

 4、forwad_list

      (1)压入元素用的是push_front(其他用的都是push_back);

    (2)只有front访问首元素(back,size都不提供);查找较慢。

5、deque

   (1)内存分段连续(由buffer构成,每个buffer是连续的),当内存不够时,重新分配一个buffer。 

   (2)没有自带的sort,只能使用全局的sort

   

6、stack、queue

    内部都是通过deque来实现,一个后进先出,一个先进先出(不提供iterator)。有人也称之为容器的适配器(Adapter)

      

7、multiset/multimap

  (1)通过insert插入元素(会慢一点),有自带的find进行查找(很快)

  (2)multimap: c.insert(pair<int, string>(i, buf)),不能使用c[i]来进行插入(key可能重复)

  (3)查找时(*item).first为key,second为value

8、unordered_multiset/unordered_multimap

哈希表实现

9、map

可通过m[i]=c来插入,内部会形成pair<>(i, c)来进行插入 

七、在双向链表下,使用不同的分配器

  直接使用容器(有默认分配器),不要使用分配器分配内存;有小量内存分配需求时,可以使用new/malloc,不要直接使用分配器

八、总结

(一)STL体系结构基础介绍的更多相关文章

  1. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

  2. SOA体系结构基础培训教程-规范标准篇

    引子:本文是<SOA体系结构基础培训教程>第3章<SOA标准与规范>课件,版权所有,转载请注明出处. 随着SOA在业界的应用日益广泛,SOA的标准化问题也成为各界日益关注的焦点 ...

  3. SOA体系结构基础培训教程

    SOA体系结构基础培训教程-规范标准篇 引子:本文是<SOA体系结构基础培训教程>第3章<SOA标准与规范>课件,版权所有,转载请注明出处. 随着SOA在业界的应用日益广泛,S ...

  4. Web3D编程入门总结——WebGL与Three.js基础介绍

    /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...

  5. C++ 迭代器 基础介绍

    C++ 迭代器 基础介绍 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器不仅仅是指针,因此你不能认为他们一定 ...

  6. TMS320C54x系列DSP的CPU与外设——第2章 TMS320C54x DSP体系结构总体介绍

    第2章 TMS320C54x DSP体系结构总体介绍 本章介绍TMS320C54x DSP体系结构的概况,包括中央处理单元(CPU).存在器和片内外设. C54x DSP采用了高级的改进哈佛结构,用8 ...

  7. Node.js学习笔记(一)基础介绍

    什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...

  8. Node.js 基础介绍

    什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...

  9. 1、git基础介绍及远程/本地仓库、分支

    1. Git基础介绍 基于Git进行开发时,首先需要将远程仓库代码clone到本地,即为本地仓库.后续大部分时间都是基于本地仓库上的分支进行编码,最后将本地仓库的代码合入远程仓库. 1.1. 远程仓库 ...

随机推荐

  1. Python学习之json序列化

    一.什么是序列化 在我们存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式.这个过程叫序列化,不同的序列化结果也不同,但目的是一样的,都是为了存储和传输 在 ...

  2. :target方法实现切换

    <!DOCTYPE HTML><html><head> <title>:target切换</title> <meta charset= ...

  3. 🍓 react,jroll滑动删除 🍓

    import React, { Component } from 'react'; import '../src/css/reset.css'; import '../src/css/delete.c ...

  4. 模拟post表单提交参数

    Content-Type: application/x-www-form-urlencoded;charset=utf-8

  5. MGR架构~高可用架构细节的梳理

    一 简介:今天咱们来聊聊mgr的细节原理相关 二 选择新主机制   1 当主节点宕掉,自动会根据服务器的server_uuid变量和group_replication_member_weight变量值 ...

  6. renren-security旧版本 分模块 的模块之间关系浅析

    Maven结构,一个父模块 六个子模块 七个pom.xml: \git\renren-security\pom.xml <modules> <module>renren-com ...

  7. MySql cmd下的学习笔记 —— 有关建立表的操作(有关于数据类型)

    (01)建表的过程实际上是 声明字段 的过程 一. 列类型(字段): 存储同样的数据时,不同的列类型,所占据的空间和效率是不一样的,这就是建表时要考虑的意义. 二.MySQL三大列类型     数值型 ...

  8. 【转载】使用python库--Graphviz为论文画出漂亮的示意图

    原文: Drawing Graphs using Dot and Graphviz 1 License Copyright (C) 2013, 2014, 2015, 2016, 2017, 2018 ...

  9. Python学习笔记-数字类型

    如何定义一个数字类型 定义var1为一个INT类型,所以在5/3 输出的是 1. var1 = 5 var1=var1/3 print var1 定义var1为一个INT类型,因为var1是INT类型 ...

  10. Python3-初识面向对象

    知识点: 面向过程VS面向对象 初识类和对象 对象之间的交互 类与对象之间的命名空间 面向对象的组合用法 面向对象的三大特性(封装.继承.多态) 继承 抽象类和接口类 多态 封装  -- (prope ...