11_4模拟实现vector
1.string——近容器
vecotr容器(类似于数组)
void resize();//长度和实际长度(实际数据发生变化)
void reserve();//扩容(只改变长度)
void max_size();//最大长度
2.使用模板实现vector
(1)mvector.h
#ifndef MVECTOR_H
#define MVECTOR_H
template<typename T>
class Mvector
{
public:
Mvector()
{
_arr = NULL;
_len = 0;
_val_len = 0;
}
Mvector(const Mvector& src)
{
if (NULL == src._arr)//判断数组为空
{
_arr = src._arr;
_len = src._len;
_val_len = src._val_len;
}
else//有数据或者空间
{
_len = src._len;
_val_len = src._val_len;
_arr = new T[_len];
for (int i = 0; i < _val_len; i++)
{
_arr[i] = src._arr[i];
}
}
}
~Mvector()
{
delete[]_arr;
_arr = NULL;
}
Mvector& operator=(const Mvector& src)
{
//防止自赋值
if (&src == this)
{
return *this;
}
//防止内存泄漏
if (NULL != _arr)
{
delete[]_arr;
}
//防止浅拷贝
_len = src._len;
_val_len = src._val_len;
if (NULL != src._arr)
{
_arr = new T[_len];
}
else
{
_arr = NULL;
}
for (int i = 0; i < _val_len; i++)
{
_arr[i] = src._arr[i];
}
return *this;
}
void push_back(const T& val)
{
if (full())
{
if (_len == 0)
{
_len = 1;
}
int len = _len << 1;
reserve(len);
}
_arr[_val_len] = val;
_val_len++;
}
void pop_back()
{
if (empty())
{
return;
}
_val_len--;
}
T back()const
{
if (empty())
{
return -1;
}
return _arr[_val_len-1];
}
int size()const
{
return _val_len;
}
void resize(int len)
{
if (len < 0)
{
len = 0;
}
if (len == 0)
{
delete[]_arr;
_arr = NULL;
_len = 0;
_val_len = 0;
return;
}
T* arr = new T[len];
memset(arr, 0, len * sizeof(T));
for (int i = 0; i < len && i < _val_len;i++)
{
arr[i] = _arr[i];
}
delete[]_arr;
_val_len = len;
_arr = arr;
}
void reserve(int len)
{
if (len <= _val_len)
{
return;
}
_len = len;
T* arr = new T[_len];
for (int i = 0; i < _val_len; i++)
{
arr[i] = _arr[i];
}
delete[]_arr;
_arr = arr;
}
bool empty()const
{
return _val_len == 0;
}
T& operator[](int pos)
{
return _arr[pos];
}
T operator[](int pos)const
{
return _arr[pos];
}
private:
bool full()
{
return _len == _val_len;
}
T* _arr;
int _len;
int _val_len;
};
#endif
(2)main.cpp
#include<vector>
#include<string>
#include<iostream>
#include"mvector.h"
using namespace std;
/*
*
* 容器
string ---- 近容器
int arr[10]
char str[10]
vector ----- 容器 ------- 数组
*/
void show(Mvector<int> & v)
{
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main()
{
Mvector<int> v1;
//cout << v1.back() << endl;
int a = int();
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
show(v1);
v1.resize(20);
show(v1);
v1.resize(5);
show(v1);
v1.resize(10);
show(v1);
v1.reserve(10);
show(v1);
v1.reserve(2);
show(v1);
//cout << v1.max_size();
v1.pop_back();
show(v1);
cout << v1.back();
v1.resize(-1);
show(v1);
/*
使用模板实现vector
*/
return 0;
}