学习标准库时要理解:源码之前,了无秘密!
STL,即标准模板库。是通过泛型编程(GP)得到的广为程序员所使用的库。
0 基础知识
1、OOP:面向对象编程,企图将datas和methods关联在一起。类似独属自己的函数,仅对自己进行操作。
2、GP:模板编程,要将datas和methods分开来。类似全局函数,要对各种东西都能操作。处理数据的方式是借助迭代器。好处:使得容器和算法全队各自独立。而所谓算法,内部的最终操作无非就是比大小。
3、操作符重载:详见:操作符重载,在该博客的2.2.2。一定要重载的操作有operator*(),operator->(),operator++(),operator++(int)这四个。
4、类模板和函数模板:详见:模板的类型和特化
1 STL的六大部件及关系
六大部件为:容器、分配器、算法、迭代器、适配器、仿函数。其关系如下图。
1、容器:是存储数据的一种东西。使用容器时,我们不需要管内存,只需要把数据放进容器中就可以了。
2、分配器:完成给容器分配内存的工作,是来处理容器的。
3、算法:有在容器本身里面做的一些操作,还有更多的操作是独立出来的,作为一个个模板函数,这就是算法。
4、迭代器:让算法处理数据的桥梁。迭代器类似一种泛化的指针。
5、仿函数:将两种奇奇怪怪的类型进行操作的函数,如两个石头比大小这种。
6、适配器:类似变压器,做“转换”操作。
2 使用STL进行编程的例子:
11行:使用vector容器,给其分配空间的分配器是int类型;
13行:使用count_if算法,计算复合14行条件的元素有几个。指定的vi.begin()和vi.end()是头尾迭代器;
14行:是一个predicate,即一个判断是不是的操作。计算大于等于40的元素有几个,使用了仿函数less来进行比较大小,接口适配器是bind2nd绑定第二参数为40,适配器not1就变成了大于40。
3 有关算法复杂度:
4 容器的前闭后开区间
所有的容器都遵循这样的规则:
下面这段代码很是重要,遍历容器时可用:
Container<T> c;
Container<T>::iterator ite = c.begin();
for(; ite != c.end(); ++ite)
{
...
}
在C++11之后,有了新的一种方式,即range_base for,详见
for(int i : {2, 3, 5, 7, 9, 13, 17, 19})
{
cout<< i << endl;
}
vector<double> vec;
for(auto elem : vec)//pass by value
{
cout << elem << endl;
}
for(auto& elem : vec)// pass by reference
{
elem *= 3;
}
上面的代码引入了auto,在写代码时,我们也可以适度的使用auto。