C++STL之vector的自定义实现
2018.10.15-至今一直在寻找C++开发岗位的工作,但是刚毕业,没有工作经验与项目经历,工作一直不太好找。聊天中有个朋友说你把STL自己实现一下,放在博客上,简单的当作自己的项目。于是就写了这篇博客。
如有用词不当或者错误之处,请联系我改正
注意点:
1、如果是像本文一样采取类模板template(泛型)来实现,则类的实现与类的声明要放在同一个文件中,否则即使你 #include"xxx.h" 了,在编译时也会提示“无法解析的外部符号”。
2、vector容器自身涉及到insert与erase,因此赋值操作必不可少,本篇博客是实现时暂未考虑到复杂数据类型,即仅仅支持简单的char、double等基本数据类型。有机会会单独发一篇博客来实现支持复杂数据类型(如class、struct)的代码。
3、目前为止,自定义容器的常用功能如resize()、reserve()、erase()和insert()的重载均为实现,后续研究出来会更新的。
4、暂时不给出测试代码,实际上测试法与vector容器 用法相同,但是应该不支持迭代器(iterator),请谨慎使用begin()、end()等函数的返回值。
5、本文开发环境 VS2013。
类MyVector的声明
template<class T>
class MyVector{
public:
MyVector<T>();
~MyVector<T>();
int size();
int capacity();
void clear();
bool empty();
void swap(MyVector<T>& v);
T at(int index);
void push_back(T v);
void pop_back();
void two(); //容器自增长
T* begin();
T* end();
T front();
T* erase(T* pos);//删除指定位置的元素,返回下一个元素的位置
//T* erase(T* start,T* end);//删除指定区间的元素,返回end对应元素的位置
T* insert(T* pos, T val);//返回val所在的位置
void insert(T* pos, int count, T val);//在pos位置插入count个val
private:
T* data; //数组用于存放元素
int Size; //实际个数
int Capacity;//现有的容量
};
类模板MyVector的外部实现
构造与析构
template<class T>
MyVector<T>::MyVector(){
Size = 0;
Capacity = 10;
data = new T[Capacity];
}
template<class T>
MyVector<T>::~MyVector(){
}
size()、capacity()、empty()、clear()的实现
template<class T>
int MyVector<T>::size(){
return this->Size;
}
template<class T>
int MyVector<T>::capacity(){
return this->Capacity;
}
template<class T>
bool MyVector<T>::empty(){
return (Size == 0);
}
template<class T>
void MyVector<T>::clear(){
while (!empty())
pop_back();
}
at()、push_back()、pop_back()的实现
template<class T>
T MyVector<T>::at(int index){
if (empty() || index > Capacity)//空 下标越界
return (T)NULL;
return data[index];
}
template<class T>
void MyVector<T>::push_back(T v){
//two();
data[Size++] = v;
}
template<class T>
void MyVector<T>::pop_back(){
if (empty())//空不可删除
return;
//throw runtime_error("empty");
//data[Size - 1] = (T*)NULL;
--Size;
}
容器自增长two()、swap()的实现
template<class T>
void MyVector<T>::two(){
if (size() > capacity()){
Capacity *= 2;
T* old = this->data;
data = new T[Capacity];
for (int i = 0; i < Size; ++i)
data[i] = old[i];
delete[]old;
}
}
template<class T>
void MyVector<T>::swap(MyVector<T>& v){
//考虑交换双方的元素个数
int len = size();
T* tmp = new T[len];//将自身的数据存储在tmp中
for (int i = 0; i < len; ++i){
tmp[i] = at(i);
}
clear();
for (int i = 0; i < v.size(); ++i){
push_back(v.at(i));
}
v.clear();
for (int i = 0; i < len; ++i)
v.push_back(tmp[i]);
}
front()、begin()、end()的实现
template<class T>
T MyVector<T>::front(){
if (!empty()){
return data[0];
}
else
return (T)NULL;
}
template<class T>
T* MyVector<T>::begin(){
if (!empty())
return data;
else
return (T*)NULL;
}
template<class T>
T* MyVector<T>::end(){
if (!empty())
return data + Size;
else{
cout << "空" << endl;
return (T*)NULL;
}
}
insert()、erase()的实现
template<class T>
T* MyVector<T>::erase(T* pos){//
T* p=pos;
T* tmp = pos + 1;
while (tmp != end()){
*pos = *tmp;
++pos;
++tmp;
}
--Size;
return p;
}
template<class T>
T* MyVector<T>::insert(T* pos, T val){
if (Size + 1 > Capacity)
two();//容量不够时,自增长
T* p = end();
int i = 0;
for (i = Size; p != pos; --i, --p){
data[i] = data[i - 1];
}
data[i] = val;
++Size;
return pos;
}
//该函数目前存在bug,当Capacity初始化过小时,会发生“中断”
template<class T>
void MyVector<T>::insert(T* pos, int count, T val){
Size += count;
while (size() > capacity()){
two();//容量不够时,自增长
cout << size() << " " << capacity() << endl;
}
T* p = (T*)NULL;
int i = 0,j=0;
for (i = size() - 1; data[i]!=*(pos-1); --i){
data[i+count] = data[i];
}
for (p = pos; p < pos +count; ++p)
*p = val;
}