vector的实现并不难,不过vector在实现的同时要需要实现一个对应的迭代器。
下面是实现源码,从测试函数中可以看出,其外部行为和STL的vector相同。
#include <iostream>
using namespace std;
template <typename TYPE>
class vector
{
private:
TYPE *data;
size_t used_bytes;
size_t total_bytes;
void resize(size_t least_size)
{
// decide new size!
if (total_bytes == 0) total_bytes = 8;
while (total_bytes < least_size)
{
total_bytes *= 2;
}
// allocate memory and copy data
TYPE *old_data = data;
data = new TYPE[total_bytes];
memcpy(data, old_data, used_bytes);
delete old_data;
}
bool index_valid(size_t index)
{
if (index >= 0 && index < used_bytes)
{
return true;
}
else
{
return false;
}
}
public:
// iterator
class iterator
{
private:
typedef vector<TYPE> VECTOR;
size_t pos;
VECTOR *pvector;
public:
iterator(){}
iterator(VECTOR *vect, size_t index)
{
pvector = vect;
pos = index;
}
size_t get_pos()
{
return pos;
}
void operator+=(size_t offset)
{
pos += offset;
}
void operator++()
{
operator+=(1);
}
void operator-=(size_t offset)
{
pos -= offset;
}
void operator--()
{
operator-=(1);
}
TYPE &operator*()
{
if (pvector->index_valid(pos))
{
return pvector->data[pos];
}
else
{
// raise exception
return pvector->data[0];
}
}
bool operator==(iterator &iter)
{
return pos == iter.pos;
}
bool operator!=(iterator &iter)
{
return !operator==(iter);
}
};
vector()
{
data = NULL;
used_bytes = 0;
total_bytes = 0;
}
vector(size_t init_size)
{
data = new TYPE[init_size];
memset(data, 0, init_size);
used_bytes = init_size;
total_bytes = init_size * sizeof(TYPE);
}
void push_back(TYPE value)
{
if (used_bytes >= total_bytes)
{
resize(total_bytes + sizeof(TYPE));
}
data[used_bytes++] = value;
}
TYPE &operator[](size_t index)
{
return data[index];
}
void clear()
{
used_bytes = 0;
}
size_t capacity()
{
return total_bytes;
}
size_t pop_back()
{
if (used_bytes > 0)
{
--used_bytes;
}
}
size_t size()
{
return used_bytes;
}
typedef iterator VECTOR_ITERATOR;
void insert(VECTOR_ITERATOR position, TYPE &value)
{
size_t pos = position.pos;
if (!index_valid(pos))
{
return;
}
if (used_bytes == total_bytes)
{
resize();
}
for (size_t i = used_bytes - 1; i >= pos; --i)
{
data[i + 1] = data[i];
}
data[pos] = value;
++size;
}
bool empty()
{
return used_bytes == 0;
}
void erase(VECTOR_ITERATOR iter)
{
int pos = iter.get_pos();
if (!index_valid(pos))
{
return;
}
for (size_t i = pos; i < used_bytes - 1; ++i)
{
data[i] = data[i + 1];
}
--used_bytes;
}
iterator begin()
{
return iterator(this, 0);
}
iterator end()
{
return iterator(NULL, used_bytes);
}
};
void vector_test(void)
{
// construct
vector<int> vect(4);
// assignment
for (int i = 0; i < 4; ++i)
{
vect[i] = i + 1;
}
// add element
vect.push_back(99);
// erase element
vect.erase(vect.begin());
// traversal
for (vector<int>::iterator iter = vect.begin();
iter != vect.end();
++iter)
{
cout << *iter << endl;
}
}
int main()
{
vector_test();
return 0;
}
当然啦,此vector也可以放置自定义类型。下面是一个测试函数。
struct person
{
int age;
};
void vector_test_person(void)
{
// construct
vector<person> vect(4);
// assignment
for (int i = 0; i < 4; ++i)
{
vect[i] = person{ i + 1 };
}
// add element
vect.push_back(person{ 88 });
// erase element
vect.erase(vect.begin());
// traversal
for (vector<person>::iterator iter = vect.begin();
iter != vect.end();
++iter)
{
cout << (*iter).age << endl;
}
}