// testVector.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
template<typename T>
class MyVector {
public:
typedef T value_type;
typedef value_type* iterator; //其实迭代器就是传进来参数的指针,这样设计就可以让用户不用知道是什么类型直接使用
MyVector():start(nullptr),finish(nullptr),end_vector(nullptr){}
T& front() {
return *start;
}
T& back() {
return *(finish - 1);
}
T* begin() {
return start;
}
T* end() {
return finish;
}
T& operator[](int index) {
return data[index];
}
void push_back(const T& value) { //如果还有空间就把新元素添加至末尾
if (finish != end_vector) {
*(finish++) = value;
}
else { //没有空间的情况下,开辟一个新的空间并把之前的内容移动过来。
size_t old_size = end_vector - start;
size_t size = (old_size == 0) ? 1 : (end_vector - start) * 2;
T *newdata = new T[size];
memmove(newdata, data, (end_vector - start)*sizeof(T));
delete[] data;
data = newdata;
start = newdata;
finish = start + old_size;
end_vector = data + size;
*(finish++) = value;
}
}
void pop_back() {
finish--;
}
~MyVector() {
delete[]data;
}
private:
T *data;
T *start;
T *finish;
T *end_vector;
};
struct A {
int f;
public:
A(int r) :f(r) {}
A()
{
f = 1;
}
};
int main() {
MyVector<A> v;
v.push_back(A(2));
v.push_back(A(3));
v.push_back(A(4));
v.push_back(A(5));
v.push_back(A(6));
MyVector<A>::iterator it = v.begin();
MyVector<A>::iterator end = v.end();
for (; it != end; it++)
printf("%d\n", it->f);
}