1. STL 六大部件

STL的部件(Components)

  • 容器(Containers)
  • 分配器(Allocator)
  • 算法(Algorithms)
  • 迭代器(Iterators)
  • 适配器(Adapters)——进行转换
  • 仿函数(Functors)

这里是一个使用了全部6种STL部件的代码案例

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
int main()
{
int p[6] = { 27, 210, 12, 47, 109, 83 };
// 容器(container): vector
// 分配器(allocator): allocator<int>
vector<int, allocator<int>> vi(p, p + 6);
// 迭代器(iterator): vi.begin(), vi.end();
// 算法(algorithm): count_if (操作整个容器的头到尾)
// 适配器(adapter): not1: 相反的, bind2nd: 绑定第二个参数
// 仿函数(function): 比他小
cout << count_if(vi.begin(), vi.end(), not1(bind2nd(less<int>(), 40)));
// 计数:所有比40大的数
}

2. 迭代器(iterator)

// 获取一个迭代器
vector<int> vint;
vector<int>::iterator it = vint.begin();
// C++11
for(auto elem : vint) {
std::cout << elem << std::endl;
}

3. 容器分类(container)

3.1 队列容器

  • Array:事先分配元素个数的数组
  • Vector:可以在尾部进行数组容量的扩充
  • Deque:双端队列,可以在头部和尾部插入元素(pop_front、pop_back,push_front,push_back)
  • Queue:队列,可以在尾部排队,头部离开
  • List:双向链表
  • Forward-List:单项链表

3.2 关系容器

  • Set / Multiset:直接存储Value
  • Map / Multimap:存储Key/Value,通过Key查找Value
  • Unordered Set / Multiset:不进行排序
  • Unordered Map / Multimap:不进行排序

  • array<int, 100> myArray:声明一个长度为100的array数组

  • vector<int> myVector:声明一个变量类型为int的vector数组
    • size() 当前元素个数
    • capacity() 容量
    • front() 第一个元素
    • back() 最后一个元素
    • data() 元素起始地址
  • list<int> myList:声明一个变量类型为int的双向链表
    • size() 当前元素个数
    • max_size() 最大分配数量
    • front() 首元素
    • back() 为元素
  • deque<int> myDeque:声明一个变量类型为int的双端队列(没有iterator,否则会破坏它的性质)
    • queue:只保留了先进先出
    • stack:只保留了后进先出
  • multiset<int> myMultiSet:底层使用红黑树实现,插入完成排序
    • insert() 插入元素
    • size() 元素个数
    • max_size() 最大存储数量
    • find() 查找元素
  • multimap<int, string> myMulitMap:底层使用红黑树实现,插入完成排序
    • insert() 插入元素(自己完成组合 pair<int, string>)
  • unordered_multiset<int> myUnMuSet:底层使用哈希表(开链法)
    • bucket_count() 篮子的数量(大于元素数量)
    • bucket_size(int n) 某个篮子内元素数量(可能为0)
    • load_factor() 载重因子
    • max_load_factor() 最大载重因子
  • unordered_multimap<int, string> myUnMuMap:底层使用哈希表(开链法)

【STL和泛型编程】1. STL基础和容器名称的更多相关文章

  1. [GeekBand] STL与泛型编程(1)

    在C++语法的学习过程中,我们已经对模板有了基本的了解.泛型编程就是以模板为工具的.泛化的编程思想.本篇文章介绍了一些在之前的文章中没有涉及到的一些模板知识.泛型编程知识和几种容器.关于模板的一些重复 ...

  2. 泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系

    2013-08-11 10:46:39 介绍STL模板的书,有两本比较经典: 一本是<Generic Programming and the STL>,中文翻译为<泛型编程与STL& ...

  3. [GeekBand] STL与泛型编程(2)

    本篇文章在上一篇文章的基础上进一步介绍一些常用的容器以及STL的一些深入知识. 一. Stack和Queue 栈和队列是非常常用的两种数据结构,由deque适配而来.关于数据结构的知识这里就不在介绍了 ...

  4. STL非变易算法 - STL算法

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1394600460.html 原创:ST ...

  5. STL源码剖析:关联式容器

    AVL树 AVL树定义:红黑树是一颗二叉搜索树,特别的是一棵保持高度平衡的二叉搜索树 AVL树特点: 每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1 AVL树插入: 说明:新增节点的平衡因子 ...

  6. STL源码剖析之序列式容器

    最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...

  7. C++STL模板库序列容器之List容器

    目录 一丶List容器的存储结构 二丶丶STL中list容器的使用. 一丶List容器的存储结构 list容器底层是链表结构来维护的.跟vector不一样. vector是数组维护的.拥有连续内存.所 ...

  8. c++ stl源码剖析学习笔记(三)容器 vector

    stl中容器有很多种 最简单的应该算是vector 一个空间连续的数组 他的构造函数有多个 以其中 template<typename T> vector(size_type n,cons ...

  9. C/C++知识要点2——STL中Vector、Map、Set容器的实现原理

    1.Vector是顺序容器.是一个动态数组.支持随机存取.插入.删除.查找等操作,在内存中是一块连续的空间.在原有空间不够情况下自己主动分配空间.添加为原来的两倍.vector随机存取效率高,可是在v ...

  10. STL源码剖析:序列式容器

    前言 容器,置物之所也.就是存放数据的地方. array(数组).list(串行).tree(树).stack(堆栈).queue(队列).hash table(杂凑表).set(集合).map(映像 ...

随机推荐

  1. 推荐一个Elasticsearch ES可视化客户端工具:ES-King,支持win、mac、linux

    ES-King:开源免费,一个现代.实用的ES GUI客户端,支持多平台. 下载地址:https://github.com/Bronya0/ES-King 我之前开源的kafka客户端kafka-ki ...

  2. SQL注入常用爆库语句

    SQL注入的时候,找到了注入点,但是老是搞不清怎么爆库,最后还是得看大佬的WP 最后,终于下定决心自己整理一下爆库的常用语句和思路,如果哪里写的不对麻烦在评论区指出:-D 省流概要 select gr ...

  3. Web前端入门第 60 问:JavaScript 各种数组定义与数组取值方法

    数组可以算是程序里面最常用的数据结构了,但凡网页上任何一个列表数据,基本都是以数组的形式存在,像表格.banner图.菜单列表.商品列表,分类列表等等,在前端领域都是以数组处理. 数组的定义 JS 的 ...

  4. Go交叉编译

    #在Mac上编译linux平台应用 GOOS=linux GOARCH=amd64 go build hello.go #在Windows上编译linux平台应用(关闭CGO) CGO_ENABLED ...

  5. slf4j、logback、log4j、log4j2的区别

    区别 slf4j是一个日志接口,自己没有具体实现日志系统,只提供了一组标准的调用api,这样将调用和具体的日志实现分离,使用slf4j后有利于根据自己实际的需求更换具体的日志系统,比如,之前使用的具体 ...

  6. 【2020.11.25提高组模拟】树的解构(deconstruct) 题解

    [2020.11.25提高组模拟]树的解构(deconstruct) 题解 题目描述 给一棵以\(1\)为根的外向树,进行\((n-1)\)次删边操作,每次都会从没有删掉的边中等概率地删掉一条边\(a ...

  7. equals与==与hashCode的区别与联系

    equals与hashcode的区别与联系 1."=="与equals的区别与联系 (1)"=="对于基本数据类型,只要值相等,就返回true,否则返回fals ...

  8. AEM6.5集成Redis详细步骤(附代码)

    一.环境准备 Redis 安装 2.配置 Redis 远程访问 二.AEM 端配置 1.添加 Redis 客户端依赖 在 AEM 项目的pom.xml中添加: <dependency> & ...

  9. UFT 关于excel及datatable的处理

    1. excel 2. datatable

  10. 敏捷 | 如何做好服务型Scrum Master?

    无论你的公司是在做敏捷转型还是一开始就使用敏捷,敏捷都是一场变革,会带来组织方式和文化理念上的改变.与此同时,敏捷也对领导力提出了新的需求,需要我们转变观念,成为一名服务型领导. 相关阅读: (1)如 ...