首先 :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。