现在开始更新侯捷的STL的部分了!!!
完整版本会在全部更新完之后就整合发出
或者也可以直接去我的个人网站上查看
关于STL这部分,原课程将其分为了四部分,我做笔记时,会将其整合,使其更具有整体性
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)
- 容器:放数据
- 分配器:是来支持容器将数据放到内存里
- 算法:是一个个函数来处理存放在容器里的数据
- 迭代器:就是来支持算法操作容器的
- 仿函数:作用类似函数,例如相加相减等等
- 适配器:有三种,分别将容器,迭代器,仿函数来进行一个转换
实例:
- 首先是创建一个 container(vector)
- allocator 来帮助 container 来分配内存(一般会忽略不写)
- 用一个 Algorithm 来操作数据(count_if 是数出满足条件的个数)
- iterator 就是一个泛化的指针,来告诉 Algorithm 要处理哪里的数据
- 用一个 functor 来判断数据(less 其有两个参数传入,第一个 < 第二个就为真)
- 先用一个 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::NestedType
和 T::SomeType
是类型名称而不是成员变量
typename
是一个用于明确指定符号是一个类型的关键字,以帮助编译器正确解析代码并避免歧义,如果不使用 typename
,编译器可能会认为符号是一个值而不是类型,导致编译错误
2 OOP vs. GP
-
OOP —— Object-Oriented programming 面向对象编程
将数据和操作关联到一起
例如容器 List,其自带了一个
sort()
,因为链表的存储空间不是连续的,Iterator 不能实现加减操作,所以不能使用全局的::sort()
-
GP —— Generic Programming 泛式编程
将数据和操作分开
- 容器和算法的团队就可以各自闭门造车,其间通过 Iterator 联通即可
- 算法通过 Iterator 确定操作范围,并通过 Iterator 取用容器的元素
- 所有的算法,其内的最终涉及元素的操作都是比大小