模板设计
首先创建一个模板类vector,这个vector中有保护元素:类指针、记录当前已有多少元素的整形变量space,记录该vector当前最大容量的整形变量,其中类指针指向的是一个动态数组,当元素不够存储时,会自动将原数组的容量扩大2倍,在该动态数组上进行添加、删除元素时直接在对该指针指向的数组上直接进行增删查改,该模板类拥有自己的成员函数,它的成员函数是对该类的功能的使用,例如:清空整个vector或者返回当前vector中有多少个元素。
功能设计
代码
–main.cpp
#include <iostream>
#include<assert.h>
#include"myvector.h"
using namespace std;
int main()
{
cout<<"创建一个vector,vec"<<endl<<endl;
vector <int> vec;
vec.push_back(2); vec.push_back(5); vec.push_back(3);
cout<<"尾部添加元素{2,5,3}"<<endl<<"vec内元素为:"<<endl; vec .Display();
vec.pop_back() ;
cout<<"尾部删除元素 "<<endl<<"vec内元素为:"<<endl; vec .Display();
vec.push_back(7);
cout<<"尾部添加元素7"<<endl<<"vec内元素为:"<<endl; vec .Display();
vector <int > vec1 ;
cout<<"将vec赋值给vec1"<<endl;
vec1 = vec;
cout<<"输出vec1为:";
vec1.Display();
vec1.insert(1,25);
cout<<"输出vec1为:";
vec1.Display();
cout<<"输出vec1第一个元素:"<<vec1.front()<<endl;
cout<<"输出vec1的组后一个元素:"<<vec1.back()<<endl<<endl;
cout<<"利用迭代器删除vec中元素值为2的元素" <<endl;
for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++)
{
if(*iter == 2)
vec.erase(iter);
}
cout<<"输出vec为:";
vec.Display();
cout<<"输出vec的大小: "<<vec.size() <<endl<<endl;
cout<<"输出vec所占内存实际大小: "<<vec.capacity()<<endl<<endl;
cout<<"利用下标访问vec中的第一位元素为:";
cout<<vec[0]<<endl;
cout<<"清空vec"<<endl;vec.clear();
cout<<"输出vec为空?为空输出1,不为空输出0"<<endl;
cout<<"输出结果:"<<vec.empty()<<endl;
return 0;
}
/*
1.vector大小:vector.size()
2.vector所占内存实际大小:vector.capacity()
3.尾部添加元素:vector.push_back()
4.尾部删除元素:vector.pop_back()
5.实现vector赋值重载
6.清空vector元素:vector.clear()
7.删除指定元素:vector.erase(it)
erase(int first ) erase(int first,int last)
8.a.vector开始指针:vector.begin()
9.b.vector尾部指针:vector.end()
10.下标访问:vector[1]
11.访问第一个元素:vector.front()
12.访问最后一个元素:vector.back()
13.改变vector的大小vector.resize(int n)
14.pos位置插入一个elem元素 insert(int pos,const T elem)
insert(int pos,int n,int elem); //在pos位置插入n个elem数据,无返回值。
15. rbegin() 返回一个指向map尾部的逆向迭代器
16.rend() 返回一个指向map头部的逆向迭代器
17 .empty()
*/
myvector.h
#include <iostream>
#include<assert.h>
using namespace std;
template <typename T > class vector
{
protected:
T* data;
int space = 0;
int max_size = 0;
public:
typedef T* iterator;
vector(int max = 5){
data = new T[max];
space = 0;
max_size = max;
}
~ vector(){ delete [] data; }
void clear(){
space = 0;
}
int capacity(){ //vector容量大小
return max_size;
}
int size(){ //vector的占内存实际大小
return space;
}
vector<T> & operator= ( vector<T> &v) //赋值运算符的重载
{
if (this != &v)
{
space = v.size();
max_size = v.capacity();
data = new T[max_size];
for (size_t i = 0; i < v.size(); ++i)
{
data[i] = v.data[i];
}
}
return*this;
}
void resize(int newspace)
{
T *temp = new T[newspace];
for(int i=0; i<space-1;i++)
{
temp[i]=data[i];
}
delete[]data;
max_size = newspace;
swap(data,temp);
}
void push_back(const T x) //增加尾元素
{
if( max_size < space +1 )
{
resize(2*space);
}
data[space++]=x;
}
void pop_back() //删除尾元素
{
if ( space == 0 ) ;
// for(int i=0;i<space-1;i++) data[i] = data[i+1];
space--;
}
bool empty(){
if(space == 0) return true;
return false;
}
void insert(int pos, const T elem)//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
{
// cout<<"elem:"<<elem<<endl;
pos--;
T *temp = new T[max_size];
for(int i=0; i<pos ;i++)
{
temp[i]=data[i];
}
temp[pos] = elem;
space++;
// if( max_size < space ) resize(2*space);
for(int i=pos+1; i<space;i++)
{
temp[i]=data[i-1];
}
swap(data,temp);
delete[]temp;
}
void insert(int pos,int n,int elem) //在pos位置插入n个elem数据
{
T *temp = new T[max_size];
for(int i=0; i<pos-1;i++)
{
temp[i]=data[i];
}
space = space+n;
if( max_size < space ) resize(2*space);
for(int i=0;i<n;i++)
temp[pos+i] = elem;
for(int i=pos+n; i<space;i++)
{
temp[i]=data[i-1];
}
delete[]data;
swap(data,temp);
}
iterator begin() {return &data[0];}
iterator end() {return &data[space];}
iterator rbegin() {return &data[space];}
iterator rend() {return &data[0];}
void erase(iterator first )
{
T *temp = new T[max_size];
int count = 0;
for(int i=0; i< space;i++)
{
if( i+&data[0] == first ) ;
else temp[count++]=data[i];
}
delete[] data;
space = count ;
swap(data,temp);
}
void erase(int first,int last)
{
T *temp = new T[max_size];
int count = 0;
for(int i=0; i< space ;i++)
{
if(i<last&&i>=first-1) ;
else temp[count++]=data[i];
}
delete[] data;
space = count ;
swap(data,temp);
}
T front(){ if(space != 0) return data[0]; }; //返回第一个数据。
T back(){ if(space != 0)return data[space-1];}; //返回最后一个数据。
void erase(int first )
{
T *temp = new T[max_size];
int count = 0;
for(int i=0; i< space;i++)
{
if(i==first) ;
else temp[count++]=data[i];
}
delete[] data;
space = count ;
swap(data,temp);
}
T& operator[](int index)
{
// cout<<this->data[index]<<endl;
return this->data[index];
}
void Display()
{
for (int i = 0; i < space; ++i)
{
cout << data[i];
cout << " ";
}
cout << endl<<endl;
}
};