1.C++容器
容器是很多编程语言必不可少的功能。容器,本身是数据结构;这种数据结构承载了各种数据类型。容器是泛型编程的重要承载。
容器,不仅提供了数据结构,还提供了各种算法和功能。所谓算法,即解决问题的方法。容器提供了一系列解决问题的方法(即算法),从而带来使用的便利性。
容器,还有个特点是:提供了分配器。分配器负责容器空间的分配和释放;这带来一种便利:让C++程序员不用考虑容器分配,从而让C++程序员避免内存分配和释放这个经典难题。
2.vector之迭代器
容器必须掌握的一个特性是迭代器。容器的迭代器,是理解容器的关键。迭代器提供这样的一种功能:不用具体管容器内部的变量,而只用提供访问功能即可。迭代器提供了一种抽象能力,让使用者使用容器而不再关心具体的数据内容,并可以对数据进行隔离。迭代器是迭代器模式,即23种设计模式之迭代器模式的体现。
迭代器基本操作为:
1)*iter //对iter进行解引用,返回迭代器iter指向的元素的引用
2)iter->men //对iter进行解引用,获取指定元素中名为men的成员。等效于(*iter).men
3)++iter //给iter加1,使其指向容器的下一个元素
4)iter++
5)--iter //给iter减1,使其指向容器的前一个元素
6)iter--
7)iter1==iter2 //比较两个迭代器是否相等,当它们指向同一个容器的同一个元素或者都指向同同一个容器的超出末端的下一个位置时,它们相等
8)iter1!=iter2
当然,在C++98中,++iter和--iter可能不支持。
vector和list迭代器比较特殊的地方在于:提供了其他容器不具有的各种功能。vector和list的迭代器功能如下:
1)iter+n //在迭代器上加(减)整数n,将产生指向容器中钱前面(后面)第n个元素的迭代器。新计算出来的迭代器必须指向容器中的元素或超出容器末端的下一个元素
2)iter-n
3)iter1+=iter2 //将iter1加上或减去iter2的运算结果赋给iter1。两个迭代器必须指向容器中的元素或超出容器末端的下一个元素
4)iter1-=iter2
5)iter1-iter2 //两个迭代器的减法,得出两个迭代器的距离。两个迭代器必须指向容器中的元素或超出容器末端的下一个元素
6)>,>=,<,<= //元素靠后的迭代器大于靠前的迭代器。两个迭代器必须指向容器中的元素或超出容器末端的下一个元素
3.容器的capacity和size
容器分配有个分配空间和使用空间的概念。capacity为分配空间的大小,size为目前使用空间的大小。分配器按照一定空间分配空间,当size逐渐接近capacity的时候,容器就开始扩容。
容器扩容,也会消耗各种资源。所以,一般情况下,如果容器存在长时间的扩容,会一般预分配一定空间,即用reserve分配一定的空间。