泛型编程与STL学习-Containers

首先 :STL即是:用泛型编程的技术 将 算法(find, sort, etc.) 和 数据结构(vector, list, deque, set, etc.) 分离开来,而其中的连接点即是:iterators。通过iterator,算法作用于某个range身上。STL中用Container 的 概念来描述数据结构。

C++语言支持的最简单的一个数据结构即:数组。数组有其自身优点如:1. 有range的概念 2. 数组静态分配于栈(stack)上,不涉及任何动态分配内存,因此比较快。3. 访问某一个元素有效率 etc.  但也有一些明显的缺点如:1. 数组没有size()之类的member function,必须确定的记录数组的大小。 2. 必须先找到指向数组开头的iterator,再利用iterator的算术运算来获得数组的结尾。3. 无法直接复制数组。 4.无法将数组以 by value 的方式传入某个函数。

因此,我们可以定义通用的Container 来描述存放元素的容器,和容器所支持的操作。以自定义的 block class 为例,它保留了数组的优点并且剔除了数组的缺点。

template <class T, size_t N>
struct block
{
	T data[N];
	typedef	T	my_value_type;
	typedef my_value_type*		my_pointer;
	typedef const my_value_type* const_my_pointer;
	typedef my_value_type&		my_reference;
	typedef const my_value_type& const_my_reference;
	typedef ptrdiff_t	my_difference_type;
	typedef size_t		my_size_type;
	typedef my_pointer		my_iterator;
	typedef const_my_pointer const_my_iterator;

	my_iterator begin() {return data;}
	my_iterator end()  {return data + N;}
	const_my_iterator begin() const {return data;}
	const_my_iterator end() const {return data + N;}
	
	typedef reverse_iterator<const_my_iterator> const_my_reverse_iterator;
	typedef reverse_iterator<my_iterator> my_reverse_iterator;

	my_reverse_iterator rbegin() {return my_reverse_iterator(end());}
	my_reverse_iterator rend() {return my_reverse_iterator(begin());}
	const_my_reverse_iterator rbegin() const {return const_my_reverse_iterator(end());}
	const_my_reverse_iterator rend() const {return const_my_reverse_iterator(begin());}

	my_reference operator [] (my_size_type n) {return data[n];}
	const_my_reference operator [] (my_size_type n) const {return data[n];}

	my_size_type size() {return N;}
	my_size_type max_size() {return N;}
	bool empty() {return N == 0;}
	void swap(block& x)
	{
		for (size_t n = 0; n < N; ++n)
		{
			std::swap(data[n],x.data[n]);
		}
	}

};
根据每个Container所操作的iterator的concept不同,可以有不同的Container concept。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值