抽象数据类型--表

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类型规范声明一个迭代器
					vector<double>::iterator pd; //pd an iterator
					//创建一个vector<double>对象
					vector<double> scores(10, 12.6);
					//执行操作
					pd = scores.begin(); //have pd point to the first element
					*pd = 22.3;          //dereference pd and assign value to first element
					++pd;                //make pd point to the next element
					//遍历容器的内容
					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类型规范声明一个迭代器
    vector<double>::iterator pd; //pd an iterator
    //创建一个vector<double>对象
    vector<double> scores(3, 12.6);

    //执行操作
    pd = scores.begin(); //have pd point to the first element
    *pd = 22.3;          //dereference pd and assign value to first element
    ++pd;                //make pd point to the next element

    //遍历容器的内容
    for(pd = scores.begin(); pd != scores.end(); pd++)
            cout << *pd << endl;
	
	pd = scores.begin(); //have pd point to the first element
	while(pd != scores.end())
			cout << *pd++ << endl;

	return 0;
}

运行结果:
22.3
12.6
12.6
22.3
12.6
12.6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值