C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 编程语言与技术

    • Effective C++: 改善程序与设计的55个具体做法

      • 第2章 - 构造/析构/赋值运算(一)
      • 第2章 - 构造/析构/赋值运算(二)
      • 第2章 - 构造/析构/赋值运算(三)
      • 第3章 - 资源管理
      • 第4章 - 设计与声明(一)
      • 第4章 - 设计与声明(二)
      • 第5章 - 实现(一)
      • 第5章 - 实现(二)
      • 第6章 - 继承与面向对象设计
      • 第7章 - 模板与泛型编程
    • 深度探索C++对象模型

      • 第1章 - 关于对象
      • 第2章 - 构造函数语意学
      • 第3章 - Data 语意学
    • STL源码剖析

      • 第1章 - STL概论和版本简介
      • 第2章 - 空间配置器
      • 第3章 - 迭代器(iterators)概念与traits编程技法(一)
      • 第3章 - 迭代器(iterators)概念与traits编程技法(二)
      • 第4章 - 序列式容器 vector
      • 第4章 - 序列式容器 list
      • 第4章 - 序列式容器 deque
      • 第4章 - 序列式容器 stack和queue
      • 第4章 - 序列式容器 heap
      • 第4章 - 序列式容器 priority_queue
      • 第4章 - 序列式容器 slist
      • 第5章 - 关联式容器 RB-tree
      • 第5章 - 关联式容器 set和map
      • 第5章 - 关联式容器 hashtable
      • 第6章 - 算法
      • 第6章 - 算法之set
      • 第7章 - 仿函数
      • 第8章 - 配接器
  • 系统与架构

    • 深入理解计算机系统

      • 第1章 - 计算机系统漫游
      • 第2章 - 信息的表示和处理
      • 第3章 - 程序的机器级表示
      • 第5章 - 优化程序性能
      • 第6章 - 存储器层次结构
      • 第7章 - 链接
      • 第8章 - 异常控制流
      • 第9章 - 虚拟内存
      • 第10章 - 系统级I/O
      • 第11章 - 网络编程
      • 第12章 - 并发编程
    • 大型网站技术架构——核心原理与案例分析

      • 第1章 - 大型网站架构演化
      • 第2章 - 大型网站架构模式
      • 第3章 - 大型网站核心架构要素
      • 第4章 - 瞬时响应:网站的高性能架构
      • 第5章 - 万无一失:网站的高可用架构
      • 第6章 - 永无止境:网站的伸缩性架构
      • 第7章 - 随需应变:网站的可扩展架构
      • 第8章 - 固若金汤:网站的安全架构
    • 从零开始学架构

      • 架构基础
      • 架构设计原则
      • 高性能架构
      • 高可用架构
    • 程序员的自我修养————链接、装载与库

      • 第1章 - 简介
      • 第2章 - 静态链路
      • 第3章 - 目标文件里有什么
      • 第4章 - 静态链接
      • 第7章 - 动态链接
      • 第8章 - 共享库版本
      • 第10章 - 内存
      • 第11章 - 运行库
      • 第12章 - 系统调用与API
      • 第13章 - 运行库实现
  • 软件开发实践

    • 重构改善既有代码的设计

      • 第1章 - 重构,第一个示例
      • 第2章 - 重构的原则
      • 第3章 - 代码的坏味道
      • 第5章 - 重构列表
      • 第6章 - 重新组织函数
      • 第7章 - 在对象之间搬移特性
      • 第8章 - 重新组织数据
      • 第9章 - 简化条件表达式
      • 第10章 - 简化函数调用
      • 第11章 - 处理概括关系
      • 第12章 - 设计之大型重构
    • 代码大全2

      • 第1章 - 欢迎进入软件构建的世界
      • 第2章 - 用隐喻来更充分地理解软件开发
      • 第3章 - 三思而后行: 前期准备
      • 第4章 - 关键的构建决策
      • 第5章 - 软件构建中的设计
    • Linux多线程服务端编程——使用muduo C++ 网络库

      • Buffer类的设计
      • 设计与实现
      • 定时器与TimerQueue
      • Protobuf网络传输和Protobuf编解码器与消息分发器
      • EventLoop类剖析
      • EventLoopThread和EventLoopThreadPool剖析
      • TCP网络库和核心类
      • Connector剖析
      • TcpClient剖析
      • 学习总结
      • timing wheel
      • 消息广播服务
      • 线程安全的对象生命期管理
  • 数据处理与应用设计

    • 数据密集型应用系统设计

      • 第1章 - 可靠、可扩展与可维护的应用系统
      • 第2章 - 数据模型与查询语言
      • 第3章 - 数据存储与检索
      • 第4章 - 数据编码与演化
      • 第5章 - 数据复制
      • 第6章 - 数据分区
      • 第7章 - 事务

第1章:STL概论和版本简介

  • 组态: __STL_STATIC_TEMPLATE_MEMBER_BUG
  • 组态:__STL_CLASS_PARTIAL_SPECIALIZATION
  • 组态:__STL_MEMBER_TEMPLATES
  • 组态:__STL_LIMITED_DEFAULT_TEMPLATES

STL概述

软件界一直期望建立一种可重复运用的方法,使得工程师、程序员不必困于重复编写前人已经编写过的源码,STL应运而生。它建立了数据结构和算法的一套标准,且各组件之间低耦合、独立性高。STL所实现的,是依据泛型思维架设起来的一个概念结构,这个以抽象概念为主题而非以实际类为主体的结构,形成了一个严谨的接口标准,在此接口下,任何组件都有最大的独立性,并以所谓迭代器胶合起来,或以所谓适配器互相配接,或以所谓仿函数动态选择某种策略。

STL提供了六大组件,彼此可以组合套用:

  1. 容器(containers):各种数据结构,如:vector、list、deque、set、map,主要用来存放数据。
  2. 算法 (algorithms):各种常见算法,如:sort、search、copy、erase......
  3. 迭代器 (iterators):扮演算法和容器中的胶合剂,是“泛型指针”。所有STL容器均有自己专属的迭代器。
  4. 仿函数 (functors):行为类似函数,可作为算法的某种策略。仿函数是一种重载了operator()的class或class template。
  5. 配接器(adapters): 修饰容器、仿函数、迭代器接口的东西。
  6. 配置器(allocators):负责空间配置和管理,配置器是一个实现了动态空间配置、空间管理、空间释放的class template.

STL六大组件的交互关系

STL六大组件

Container通过Allocator取得数据储存空间,Algorithm通过Iterator存取Container内容,Functor可以协助Algorithm完成不同的策略变化,Adapter可以修饰或套接Functor。

stl_config.h中的各种组态

组态: __STL_STATIC_TEMPLATE_MEMBER_BUG

// file: 1config3.cpp 
// 测试在 class template中 拥有 static data members. 
// test __STL_STATIC_TEMPLATE_MEMBER_BUG, defined in <stl_config.h> 
// ref. C++ Primer 3/e, p.839 
// vc6[o] cb4[x] gcc[o] 
// cb4 does not support static data member initialization.

// 如果编译器无法处理static member of template classes(模板类静态成员)就定义。
// 即对于模板类中,模板类型不同时的静态变量不同。

#include <iostream>
using namespace std;

template <typename T>
class TestClass {
public:
    static int _data;
};

// 需要加上template<>,否则编译出错,进行内存配置
template<> int TestClass<int>::_data = 1;
template<> int TestClass<char>::_data = 1;

int main() {

    cout << TestClass<int>::_data << endl;
    cout << TestClass<char>::_data << endl;
    
    TestClass<int> obji1, obji2;
    TestClass<char> objc1, objc2;
    cout << obji1._data << " " << obji2._data << endl;
    cout << objc1._data << " " << objc2._data << endl;

    obji1._data = 3;
    objc2._data = 4;

    cout << obji1._data << " " << obji2._data << endl;
    cout << objc1._data << " " << objc2._data << endl;
}

组态:__STL_CLASS_PARTIAL_SPECIALIZATION

// file: 1config5.cpp 
// 测试 class template partial specialization 
// — 在 class template的一般化设计之外,特别针对某些 template参数做特殊设计。
// test __STL_CLASS_PARTIAL_SPECIALIZATION in <stl_config.h> 
// ref. C++ Primer 3/e, p.860 
// vc6[x] cb4[o] gcc[o]

// 如果编译器支持 partial specialization of class templates(模板类偏特化)就定义。
// 在模板类一般化设计之外(全特化),针对某些template做特殊设计。
// “所谓的partial specialization的另一个意思是提供另一份template定义式,而其本身仍是templatized”
// 全特化就是所有的模板都为具体的类。
// T* 特化允许用指针类型匹配的模式(也只能匹配指针类型)。
// const T* 特化允许使用指向const的指针 类型匹配(也只能匹配指向const的指针)。

#include <iostream>
using namespace std;

// 一般化设计
template <class I, class O>
struct TestClass {
    TestClass() {
        cout << "I, O" << endl;
    }
};

// 特殊化设计
template <class T>
struct TestClass<T*, T*> {
    TestClass() {
        cout << "T*, T*" << endl;
    }
};

// 特殊化设计
template <class T>
struct TestClass<const T*, T*> {
    TestClass() {
        cout << "const T*, T*" << endl;
    }
};

int main() {
    TestClass<int, char> obj1;
    TestClass<int *, int *> obj2;
    TestClass<const int *, int *> obj3;
}

组态:__STL_MEMBER_TEMPLATES

// file: 1config8.cpp 
// 测试 class template之内可否再有 template (members). 
// test __STL_MEMBER_TEMPLATES in <stl_config.h> 
// ref. C++ Primer 3/e, p.844 
// vc6[o] cb4[o] gcc[o] 

// 如果编译器支持template members of classes(模板类内嵌套模板) 就定义。

#include <iostream>
using namespace std;

class alloc {
};

template <class T, class Alloc=alloc>
class vec {
public:
    typedef T value_type;
    typedef value_type* iterator; // 迭代器为指针
    // typedef T *iterator; // 直接定义也可

    template <class I> // 模板嵌套模板
    void insert(iterator position, I first, I last) {
        cout << "insert()" << endl;
    }
};

int main() {
    int ia[5] = {0, 1, 2, 3, 4};

    vec<int> x;
    vec<int>::iterator ite;
    x.insert(ite, ia, ia + 5);
}

组态:__STL_LIMITED_DEFAULT_TEMPLATES

// file: 1config10.cpp 
// 测试 template参数可否根据前㆒个 template参数而设定默认值。
// test __STL_LIMITED_DEFAULT_TEMPLATES in <stl_config.h> 
// ref. C++ Primer 3/e, p.816 
// vc6[o] cb4[o] gcc[o]

// 如果编译器支持一个template参数可以根据前一个template的参数设置就定义。

#include <iostream>
#include <cstddef> // for size_t
using namespace std;

class alloc {
};

template <class T, class Alloc=alloc, size_t BufSiz=0>
class deque {
public:
    deque() {
        cout << "deque()" << endl;
    }
};

template <class T, class Sequence = deque<T>>
class stack {
public:
    stack() {
        cout << "stack" << endl;
    }
private:
    Sequence c;
};

int main() {
    stack<int> x;
}
Last Updated:
Contributors: klc407073648
Next
第2章 - 空间配置器