1.抽象容器类型
(1)顺序容器:拥有由单一类型元素组成的一个有序集合。两个主要的顺序容器是List 和 vector。
(2)关联容器:支持查询一个元素是否存在,并且可以有效的获取元素。两个基本的关联容器是map(映射)和set(集合)。
map是一个键值对,map可以很好的支持电话目录;
set包含一个单一键值,有效支持关于元素是否存在的查询。
vector表示一段连续的内存区域,每个元素被顺序寻存储在这段内存中,在vector的随机访问效率很好,因为每次访问离vector起始处的位移都是固定的,但是,在任意位置,而不是在vector末尾插入元素,则效率很低,因为他需要把带插入元素右边的每个元素都拷贝一边。
list表示非连续的内存区域,并通过一对指向首尾元素的指针双良链表起来,从而允许向前和向后两个方向进行遍历。在list的任意位置插入和删除元素的效率都很好,从而允许被重新赋值,但是,不需要用拷贝元素来实现移动。另一方面,它对随机访问的支持并不好,访问一个元素都需要遍历中间的元素,另外,每个元素还有两个指针的二外空间开销。
选择顺序容器类型的一些准则:
a.如果我们需要随机访问一个容器,则vector要比list好的多。
b.如果我们已知要存储元素的个数,则vector又是一个比list好的选择。
c.如果我们需要的不只是在容器两端插入和删除元素,则list显然要比vector好。
d.除非我们需要在容器首部插入和删除元素,否则vector要比deque好。
2.迭代器(iterator)
迭代器提供了一种一般化的方法,对顺序或关联容器类型中的每个元素进行连续访问。
例如:iter是任意容器类型的一个iterator,则++iter向前移动迭代器,使其指向容器的下一个元素,而×iter返回iterator指向元素的值。
每种容器类型都提供一个begin()和一个end()成员函数;
a.begin()返回一个iterator,他指向容器的的一个元素;
b.end()返回一个iterator,它指向容器的末元素的下一个位置。
为了迭代任意容器类型的元素,我们可以这样写:
for(iter = container.begin(); iter !=container.end();iter++){
do_something(*iter);
}
3.泛型算法