1 、抽象数据类型(ADT)的概念:Abstract Data Type是带有一组操作的一些对象的集合。
2 、表的两种实现方式:数组和列表(对应于STL中的vector和list)。
3 、STL中的vector和list:
a、vector提供表ADT的一种可增长的数据实现,而list则提供表ADT的双向链表实现。
vector优缺点:
vector优点:以常数时间可索引的;
vector缺点:插入新项和删除现有项的代价昂贵,除非发生在尾端 。
list优缺点:
list优点:插入新项和删除现有项的代价低廉,但假设变动的位置是已知的;
list缺点:不容易被索引。
两者执行查找时都是低效的。
b、vector和list两者均为类模板,用其所存储的项的类型来实例化具体的对象,方法
所有STL容器都可用:
int size ( ) const : 返回容器中的元素的个数
void clear ( ) : 从容器中删除所有元素
bool empty ( ) const : 若容器中不含有元素则返回true,否则返回false
两者都支持以常数时间向表的尾端添加和从表的尾端删除的操作:
void push_back ( const Object & x) : 把x添加到表的尾端
void pop_back ( ) : 删除位于表的尾端的对象
const Object & back ( ) const : 返回位于表的尾端处的对象(还提供一个返回引用的修改函数)
const Object & front ( ) const : 返回位于表的前端处的对象(还提供一个返回引用的修改函数)
双向链表在其前端可以进行高效的改动,而vector不能,以下方法只有list具备:
void push_front ( const Object & x) : 把x添加到表的前端
void pop_front ( ) : 删除位于表的前端处的对象
只有vector具有的方法:
Object & operator[ ] ( int idx) : 返回vector中下标为idx的对象,不带界限
检验(还提供一个返回常量引用的访问函数)
Object & at ( int idx) : 返回vector中下标为idx的对象,带界限
检验(还提供一个返回常量引用的访问函数)
int capacity ( ) const : 返回vector的内部容量
void reserve ( int newCapacity) : 设置新的容量,如果有好的估计可用,那么它可以用来
避免扩展vector
c、迭代器:对表的一些操作,尤其是那些在表的中间进行精密的插入和删除操作,需要位置的概念,在STL
中,位置由内嵌类型iterator来表示。
* * 获取迭代器:
STL表(以及所有其他的STL容器)定义了一对方法:
iterator begin ( ) : 返回一个适当的迭代器,表示容器中的第一项
iterator end ( ) : 返回一个适当的迭代器,表示容器中的尾端标记
example:
{
vector< double > : : iterator pd;
vector< double > scores ( 10 , 12.6 ) ;
pd = scores. begin ( ) ;
* pd = 22.3 ;
++ pd;
for ( pd = scores. begin ( ) ; pd != scores. end ( ) ; pd++ )
cout << * pd << endl;
}
* * 迭代器本身可以执行的操作:
基于example中的代码片段可以发现,迭代器可以使用== 和!= 进行比较,并且可能需要定义一些拷贝
构造函数和operator= 函数。因此,迭代器很多方法用到运算重载符。
iter++ 和++ iter:将迭代器推进到下一个位置
* iter:返回对存储在迭代器iter的位置上的对象的引用
iter1 == iter2:若iter1和iter2指向同一个位置则返回true,否则返回false
iter1 != iter1:若iter1和iter2指向不同的位置则返回true,否则返回false
example:
{
vector< double > : : iterator pd = scores. begin ( ) ;
while ( pd != scores. end ( ) )
cout << * pd++ << endl;
}
* * 需要迭代器3 个最常用的方法,从表的指定位置上进行添加或删除的操作:
iterator insert ( iterator pos, const Object & x) :把x添加到表中由迭代器pos所给定的位
置之前的位置上,这是对list(但不是对vector)的常数时间的操作。返回值指向被插入项的位置的一个迭代器。
iterator erase ( iterator pos) : 删除由迭代器所给定的位置上的对象,这是对list(但不是对vector)的
常数时间的操作,返回调用之前pos的后继元素所在的位置。该操作使pos失效。
iterator erase ( iterator start, iterator end) : 删除从位置start开始直到但不包括end,为止的
所有项。整个表可以通过c. erase ( c. begin ( ) , c. end ( ) ) 而被删除。
* * const_iterators
* 在STL中,每一个集合容器不仅包含一个内嵌类型iterator,而且还有一个内嵌类型的const_iterator,在
iterator和const_iterator之间的主要区别在于,对const_iterator,operator* 返回一个常量引用,因而
对于const_iterator的* itr不能出现在赋值语句的左边。
* 可以通过两种版本的begin和两种版本的end来完成遍历:
iterator begin ( )
const_iterator begin ( ) const
iterator end ( )
const_iterator end ( ) const
这两种形式的begin可以在同一个类中只因为方法的定常性( const - ness) (即,是访问函数还是修改函数)被认为是特征的一部分。
#include <vector>
#include <stdio.h>
#include <iostream>
using namespace std;
int main ( void )
{
vector< double > : : iterator pd;
vector< double > scores ( 3 , 12.6 ) ;
pd = scores. begin ( ) ;
* pd = 22.3 ;
++ pd;
for ( pd = scores. begin ( ) ; pd != scores. end ( ) ; pd++ )
cout << * pd << endl;
pd = scores. begin ( ) ;
while ( pd != scores. end ( ) )
cout << * pd++ << endl;
return 0 ;
}
运行结果:
22.3
12.6
12.6
22.3
12.6
12.6