要实现的函数: 构造函数;析构函数;拷贝构造;拷贝赋值;at(); empty();full() ;front(); back(); size(); clear(); expand(); push_back(); pop_back()。
#include <iostream>
#include <cstring>
using namespace std;
template <typename T>
class Myvector
{
private:
T *first;
T *last;
T *end;
T data;
T num;
public:
//无参构造函数
Myvector() {
first = nullptr;
last = first;
end = first;
}
//有参构造函数1
Myvector(T n, T d):data(d), num(n)
{
first = new T(n);
last = first;
end = first+n;
for(int i=0; i<n; i++) {
*last = data;
last++;
}
}
//析构函数
~Myvector() {
delete first;
first = nullptr;
delete last;
last = nullptr;
delete end;
end = nullptr;
}
//拷贝构造
Myvector(const Myvector &other):first(other.first), last(other.last), end(other.end), data(other.data) {}
//拷贝赋值
Myvector &operator=(const Myvector &other) {
this->first = other.first;
this->last = other.last;
this->end = other.end;
this->data = other.data;
return *this;
}
//at() 访问指定位置的元素
T &at(int n) {
T* p = first;
return *(p+n);
}
//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;
}
//capacity() 当前所能容纳元素的最大空间
size_t capacity() {
return end-first;
}
//clear() 清空所有元素
void clear() {
first=last;
}
//expand() 二倍扩容函数
void expand() {
size_t size1 = size();
if(last==end) {
T *temp = new T[size1*2];
memcpy(first, temp, (sizeof(T)*size1));
delete []first;
first = temp;
last = first+size1;
end = first+(size1*2);
}
}
//push_back() 尾插
void push_back(T r) {
if(full()) {
first = new T;
last = end = first+1;
}else {
expand();
}
*last = r;
last++;
}
//pop_back() 尾删
void pop_back() {
last--;
}
//遍历
void show() {
for(auto p=first; p!=last; p++) {
cout<<*p<<" ";
}
cout<<endl;
}
};
int main()
{
Myvector<int> m1(8, 5);
Myvector<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;
}
Myvector<int> m2;
cout<<"m2.size = "<<m2.size()<<" m2.capacity = "<<m2.capacity()<<endl;
for(int i=0; i<10; i++) {
m2.push_back(i+1);
cout<<"m2.size = "<<m2.size()<<" m2.capacity = "<<m2.capacity()<<endl;
}
m2.show();
m1.clear();
m2.clear();
m3.clear();
return 0;
}