目录
大框架
为了与库里实现的更接近一些,先来看一下STL中是如何实现vector的(这里不是PJ版,PJ版稍微晦涩一点不容易理解,这里采用Linux下g++的版本)这里仅就大体框架做个简单介绍,其中复杂的概念不做过多解释。
首先是vector定义的模板参数T和Alloc,这是空间配置器是一种底层实现机制,使用角度不用管。
可以看到源码做了很多typedef,主要是对格式的控制和方便理解编写。其中将T* typedef成了iterator,这个要注意,后面protected 成员变量会用到。
这里成员变量就用到了刚刚typedef的iterator,实际上就是T* start ; T* finish; T* end_of_storage;
T就是实例化模板参数。好像与我们设想的变量不太一样,我们设想的应该是有size和capacity的,但是这里全部统一使用指针,其实只是改变了使用方式,本质还是一样的。
假设存在size(有效数据个数),capacity(容量),那么finish也可以表示成start+size,end_of_storage也可以表示成strat+capacity,本质是一样的。
后面是各个接口的实现,后面我们自己实现的时候具体说明,先把大框架搭建起来。
namespace bc
{
template<class T>
class vector
{
public:
typedef T* iterator;
private:
iterator _start;
iterator _finish;
iterator _end_of_storage;
};
}
为了避免和库里的冲突,将我们的实现代码封在命名空间内,库里的繁杂的typedef我们省略,只保留基本的T* 的重命名和成员变量表示。
接口实现
vector.h
#pragma once
#include<iostream>
#include<vector>
#include<assert.h>
using namespace std;
namespace bc
{
template<class T>
class vector
{
public:
typedef T* iterator;
vector()
:_start(nullptr)
, _finish(nullptr)
, _end_of_storage(nullptr)
{ }
//拷贝构造写法一
//vector(const vector<T>& v)
// : _start(nullptr)
// , _finish(nullptr)
// , _end_of_storage(nullptr)
//{
// reserve(size());
// for (auto& e : v) {
// push_back(e);
// }
//}
//拷贝构造现代写法
template<class InputIterator>
vector(InputIterator first, InputIterator last)
: _start(nullptr)
, _finish(nullptr)
, _end_of_storage(nullptr)
{
while (first != last) {
push_back(*first);
first++;
}
}
vector(vector<T>& v)
: _start(nullptr)
, _finish(n