手动实现My_vector。
要实现的函数:
构造函数;析构函数;拷贝构造;拷贝赋值;at(); empty();full() ;front(); back(); size(); clear(); expand(); 二倍扩容函数 push_back(); pop_back()。
#include <iostream>
#include <cstring>
using namespace std;
template <typename T>
class My_vector
{
private:
T *first;
T *last;
T *end;
T data;
T len;
public:
//无参构造
My_vector () {
first = nullptr;
last = first;
end = first;
}
//有参构造
My_vector(T d,T l) : data(d),len(l){
first = new T(l);
last = first;
end = first + l - 1;
int i = 0;
while(i < l)
{
*last = data;
i++;
last++;
}
}
//析构函数
~My_vector() {
delete first;
first = nullptr;
delete last ;
last = nullptr;
delete end;
end = nullptr;
}
//拷贝构造
My_vector(const My_vector &other):first(other.first),last(other.last),\
end(other.end),data(other.data) {
}
//拷贝赋值
My_vector &operator= (const My_vector& other)
{
this->first = other.first;
this->last = other.last;
this->end = other.end;
this->data = other.data;
return *this;
}
//at()
T &at(int l)
{
T *p = first;
return *(p + l);
}
//empty()
bool empty()
{
return first == last;
}
//full()
bool full()
{
return last == end;
}
//front()
T front()
{
return *(first);
}
//back()
T back()
{
return *(last - 1);
}
//size()
size_t size()
{
return last - first;
}
//clear()
void clear()
{
first = last;
}
//expand()
void expand()
{
int new_size = last-first+1;
T *new_first=new T[new_size*2];
for(int i=0;i<new_size;++i)
{
*(new_first+i)=*(first+i);
}
first = new_first;
last = new_first + new_size - 1;
end = new_first + new_size*2;
}
//push_back()
void push_back(T r) {
if(full())
{
expand();
}
else if(empty())
{
first = new T;
last = end = first+1;
}
*last = r;
last++;
}
//pop_back()
void pop_back() {
last--;
}
//遍历
void show() {
if(empty())
return;
for(auto p=first; p!=last; p++) {
cout<<*p<<" ";
}
cout<<endl;
}
};
int main()
{
My_vector<int> m1(1, 3);
My_vector<int> m3;
m3 = m1;
m3.show();
cout<<"m1.size = "<<m1.size()<<endl;
m1.show();
cout<<"m1.at(2) = "<<m1.at(2)<<endl;
if(m1.empty()) {
cout<<"m1为空!"<<endl;
}else {
cout<<"m1不为空!"<<endl;
}
// My_vector<int> m2;
// cout << "m2.size = " << m2.size() << endl;
// for(int i=0; i<10; i++) {
// m2.push_back(i+1);
// cout<<"m2.size = "<<m2.size()<<endl;
// }
// m1.push_back(1314);
// m1.show();
// m2.push_back(1314);
// m2.show();
m1.clear();
// m2.clear();
m3.clear();
cout << "Hello World!" << endl;
return 0;
}