C++标准模板库(STL)学习和使用笔记之二

常用的容器根据其是否有序排列可以分为:顺序容器和关联容器。且所有容器都是类模板。可以看到的是在C++的标准库中模板和泛型编程以及运算符重载等技术被广泛的应用,而我们实际开发中用到的最多的是面向对象的技术,所以标准库的代码看起来很费劲。

顺序容器:array,vector,deque,list,forward_list。这些容器中的元素是无序的。

关联容器:set,multiset,map,multimap。这些容器中的元素在放入容器时就被放入到合适的位置上,因此插入元素是不能任意指定插入的位置,即它们是有序的。

所有容器都有的成员函数如下:

  • int size():返回容器对象中元素的个数。
  • bool empty():判断容器对象是否为空。
  • begin():返回指向容器中第一个元素的迭代器。
  • end():返回指向容器中最后一个元素后面的位置的迭代器。
  • rbegin():返回指向容器中最后一个元素的反向迭代器。
  • rend():返回指向容器中第一个元素前面的位置的反向迭代器。
  • erase(...):从容器中删除一个或几个元素。
  • clear():从容器中删除所有元素。

顺序容器还有以下常用成员函数:

  • front():返回容器中第一个元素的引用。
  • back():返回容器中最后一个元素的引用。
  • push_back():在容器末尾增加新元素。
  • pop_back():删除容器末尾的元素。
  • insert(...):插入一个或多个元素。

要访问容器中的元素,就要用到迭代器。它是容器和算法之间的中介,它其实是一个拥有指针功能的类,为了实现这个功能标准库内部也做了很多的工作。

迭代器可以根据其迭代的方向进行分类,例如,可以将迭代器分为:

正向迭代器      容器类名::iterator  迭代器名;

常量正向迭代器     容器类名::const_iterator  迭代器名;

反向迭代器    容器类名::reverse_iterator  迭代器名;

常量反向迭代器    容器类名::const_reverse_iterator  迭代器名;

还可以按功能进行分类,这里我觉得是必须要理解和记忆的。例如,按照迭代器的功能强弱可以分为:

  • 单向迭代器。假设 p 是一个正向迭代器,则 p 支持以下操作:++p,p++,*p。
  • 双向迭代器。双向迭代器具有正向迭代器的全部功能。除此之外--pp--都可以。
  • 随机访问迭代器。随机访问迭代器具有双向迭代器的全部功能。若 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:p+=i:使得 p 往后移动 i 个元素。p-=i:使得 p 往前移动 i 个元素。p+i:返回 p 后面第 i 个元素的迭代器。p-i:返回 p 前面第 i 个元素的迭代器。p[i]:返回 p 后面第 i 个元素的引用。

如果知道了不同容器的内存分布情况,可以很快的知道不同容器的迭代器支持什么样的功能。

容器 迭代器功能
array 随机访问
vector 随机访问
deque 随机访问
list 双向
set/multiset 双向

map/multimap

双向
forward_list 单向
stack 不支持迭代器
queue 不支持迭代器

标准库算法的实现都要通过操作迭代器来实现,可以看到不同容器的迭代器有不同的功能,因此它们所支持的算法也有所不同。虽然有一些通用的算法,但是如果这个容器本身有相同的算法的话,那么就应该使用容器本身的算法。

你可能感兴趣的:(C++)