1 STL概述 + 2 OOPvsGP

 

1 STL概述

STL —— Standard Template Library,标准模板库

C++ Standard LIbrary,C++标准库中包含STL(即STL+一些小东西)

1.1 头文件名称

  • C++标准库的 header files 不带 .h,例如:#include<vector>
  • 新式 C header files 不带 .h,例如:#include<cstdio>
  • 老式 C header files 带 .h 仍然可用,例如:#include<stdio.h>

新式 header 内的组件封装于 namespace std

老式 header 内的组件封装于 namespace std

1.2 STL基础介绍

STL六大部件:容器(Containers)、分配器(Allocators)、算法(Algorithms)、迭代器(Iterators)、仿函数(Functors)、适配器(Adapters)

  • 容器:放数据
  • 分配器:是来支持容器将数据放到内存里
  • 算法:是一个个函数来处理存放在容器里的数据
  • 迭代器:就是来支持算法操作容器的
  • 仿函数:作用类似函数,例如相加相减等等
  • 适配器:有三种,分别将容器,迭代器,仿函数来进行一个转换

image-20230818085837524

实例:

image-20230818091503166

  1. 首先是创建一个 container(vector
  2. allocator 来帮助 container 来分配内存(一般会忽略不写)
  3. 用一个 Algorithm 来操作数据(count_if 是数出满足条件的个数)
  4. iterator 就是一个泛化的指针,来告诉 Algorithm 要处理哪里的数据
  5. 用一个 functor 来判断数据(less 其有两个参数传入,第一个 < 第二个就为真)
  6. 先用一个 function adapter(bind2nd)绑定了第二个参数为 40;再用一个 function adapter(not1)来对整个判断结果进行否定

判断条件 predicate 为:not1(bind2nd(less<int>(), 40)) —— 表示 >= 40 数为真

前闭后开:[ ),基本所有容器都有 begin() end(),但 begin 是指向的容器的第一个元素,而 end 是指向的容器最后一个元素的下一个

例子:遍历容器

 ...
 Container<T> c;
 Container<T>::iterator i = c.begin();
 for (; i != c.end(); ++i)
 {
  ...
 }
 
 
 //但在C++11中可以用新语法简写
 ...
 Container<T> c;
 for (auto elem : c)
 {
  ...
 }

1.3 typename

在模板参数的关键字使用中与 class 是一样的

在类型前面加上 typename

 template <typename T>
 class MyTemplateClass {
 public:
     typedef typename T::NestedType NestedType;
 };
 
 template <typename T>
 void MyTemplateFunction() {
     typename T::SomeType variable;
     // ...
 }
 

在这个例子中,typename 用于告诉编译器 T::NestedTypeT::SomeType 是类型名称而不是成员变量

typename 是一个用于明确指定符号是一个类型的关键字,以帮助编译器正确解析代码并避免歧义,如果不使用 typename,编译器可能会认为符号是一个值而不是类型,导致编译错误。

2 OOP vs. GP

  • OOP —— Object-Oriented programming 面向对象编程

    数据操作关联到一起

    例如容器 List,其自带了一个 sort(),因为链表的存储空间不是连续的,Iterator 不能实现加减操作,所以不能使用全局的 ::sort()

  • GP —— Generic Programming 泛式编程

    数据操作分开

    • 容器和算法的团队就可以各自闭门造车,其间通过 Iterator 联通即可
    • 算法通过 Iterator 确定操作范围,并通过 Iterator 取用容器的元素
    • 所有的算法,其内的最终涉及元素的操作都是比大小