用了这么久C++,却还不了解其下非常出名的标准模板库(STL),实在是不该

故,参照《泛型编程与STL》一书,开始学习

说实话,此书在一些名词的翻译上显得云来雾去,但总体还不错

概览

STL的算法和容器是分开的,新增算法并不需要改变容器

这就意味着,STL的容器必须遵循某种规则,这种规则是被算法所通用的

例如,char*可以是一个容器,其可以使用++ -- ==这样的运算符号,分别有不同的作用,那么对于另一个容器,可能是class a,则同样要支持这些符号

STL的做法是对那些不适用一些运算符号的实例(例如类、结构体)采用重载运算符的方法来使他们支持这些运算

第二章节

Ranges

STL中有一个被称为Range的概念,这一概念大致等同于python的range,都表示在两者之间的范围,且左闭右开

同时,Range还具有有效性,即若Range所表示的集合为空集,则该Range无效

模板的使用

这一节引出了C++的template,其作用类似于Java的泛型,均是想用一种方法来表示全部类型

template的用法大致如下

1
2
3
4
5
template<class T>
T add(T t)
{
return t+1;
}

上述代码表示,add函数接收类型为T的参数,将其增1之后返回

这里的T可以为intdoublefloat,以及其他所有支持+1的类型

例如

1
2
3
4
5
6
7
int main()
{
double a = 1.1;
double b = add(a);
printf("%lf\n", b);
return 0;
}

在讲到链表的时候,链表的节点用的是struct,但是直接重载struct的操作运算符是不被允许的,因此需要对它外覆一个类,然后重载这个类的一系列操作运算符

Concept

此处开始着重讲解何为Concept

首先,Concept是一组条件,如果说T是Concept c的一个模型,那么T必须满足c的所有条件

其次,Concept可以想象成类型的集合,例如char*, double*, float*等等,如果说T是Concept c的一个模型,那么T必须是c的一个元素

最后,Concept对于算法来说类似于一种规章制度,所有的算法都必须依照这一制度来运行。

基本的Concept包括

  • 赋值
  • 复制
  • 默认构造
  • 相等或不等
  • 大于或小于

Iterators

此处开始讲迭代器,即泛型指针,也就是用了template关键字的类或者结构体指针

迭代器需要被一般化,即迭代器需要是Concept的一个模型

Input Iterators

本质上,Input Iterators是一种类似指针的东西,它在谈到iterator range的时候有意义

当它作为C指针的时候,它是可取值的,可跨越尾端的,以及可为NULL的,可跨越尾端的是指,它可以指向数组最后的一个元素的后一个元素

它可以被比较,即比较Iterator1是否等于Iterator2

它可以进行累加动作

最好不要对一个Input Iterator进行赋值

使用Input Iterators的正确方式是使它只单向遍历Range一次

Output Iterators

Output Iterators与Input Iterators类似,当然区别也在名字上体现了出来,即它可以被赋值,但是不能从它取值

Forward Iterators

不同于前两者,它允许同时读和写,其他性质和前两者相同

Bidirectional Iterators

不同于Forward Iterators,它允许进行自减操作,其他性质与Forward Iterators相同

Random Iterators

不同于前者,它允许增n或者减n

总结

Input Iterator和Output Iterator是限制最多的两个Concepts, 其中一个有只读性,另一个有只写性;两者都支持对某个区间进行向前遍历的行为,而应用于单纯的single-pass算法。

Forward Iterators也支持对某个区间的前向遍历操作,但它支持更一般化的算法。Forward Iterators就像普通的C指针那样可以指向某物

Bidirectional Iterators是Forward Iterators的一个强化,而Random Iterators又是Bidirectional Iterators的强化,所以,Bidirectional Iterators与Random Iterators同样支持向前遍历,以及C指针模式。不同的是他们还提供其他的模式,比如前者允许逆向遍历,后者允许任意距离的跳跃

这些不同的Iterator Concepts提供了泛型算法的法则,限制了迭代器的行为,使用约束来让其更加规则


总结

总的来说,直到看到这里,这本书所讲的内容对我来说并没有太新的东西,让我感到有点新奇的就是Concept和Iterator,我似乎在学习Java的时候接触过类似的知识……