1+ #include < string>
2+
3+ template <class T , class Alloc = alloc>
4+ class vector {
5+ public:
6+ vector () : start(0 ), finish(0 ), end_of_storage(0 ) {} // 默认构造函数
7+ explicit vector (size_type n) { fill_initialize (n, T ()); } // 必须显示的调用这个构造函数, 接受一个值
8+ vector (size_type n, const T& value) { fill_initialize (n, value); } // 接受一个大小和初始化值. int和long都执行相同的函数初始化
9+ vector (int n, const T& value) { fill_initialize (n, value); }
10+ vector (long n, const T& value) { fill_initialize (n, value); }
11+ vector (const vector<T, Alloc>& x); // 接受一个vector参数的构造函数
12+ public:
13+ typedef T value_type; // 定义vector自身的嵌套型别
14+ typedef value_type* pointer;
15+ typedef const value_type* const_pointer;
16+
17+ typedef value_type* iterator; // 定义迭代器, 这里就只是一个普通的指针
18+ typedef const value_type* const_iterator;
19+ typedef value_type& reference;
20+ typedef const value_type& const_reference;
21+ typedef size_t size_type;
22+ typedef ptrdiff_t difference_type;
23+ public:
24+ iterator begin () { return start; }
25+ iterator end () { return finish; }
26+ size_type size () const { return size_type (end () - begin ()); }
27+ size_type max_size () const { return size_type (-1 ) / sizeof (T); } // 最大能存储的元素个数
28+ size_type capacity () const { return size_type (end_of_storage - begin ()); }
29+ bool empty () const { return begin () == end (); }
30+ reference operator [](size_type n) { return *(begin () + n); }
31+ reference front () { return *begin (); }
32+ reference back () { return *(end () - 1 ); }
33+ protected:
34+ typedef simple_alloc<value_type, Alloc> data_allocator; // 设置其空间配置器
35+ iterator start; // 表示目前使用空间的头
36+ iterator finish; // 表示目前使用空间的尾
37+ iterator end_of_storage; // 表示目前可用空间的尾
38+ ...
39+ };
40+
41+ void fill_initialize (size_type n, const T& value) {
42+ start = allocate_and_fill (n, value); // 初始化并初始化值
43+ finish = start + n;
44+ end_of_storage = finish;
45+ }
46+
47+ // 调用默认的第二配置器分配内存, 分配失败就释放所分配的内存
48+ iterator allocate_and_fill (size_type n, const T& x) {
49+ iterator result = data_allocator::allocate (n); // 申请n个元素的线性空间.
50+ __STL_TRY // 对整个线性空间进行初始化, 如果有一个失败则删除全部空间并抛出异常.
51+ {
52+ uninitialized_fill_n (result, n, x);
53+ return result;
54+ }
55+ __STL_UNWIND (data_allocator::deallocate (result, n));
56+ }
0 commit comments