主要练习模板的使用
代码如下:
#ifndef _MY_VECTOR_H_
#define _MY_VECTOR_H_
template<class T>
class my_vector
{
public:
explicit my_vector(int initSize = 0) :m_size(initSize), m_capacity(initSize)
{
p_arrays = new T[initSize];
}
my_vector(const my_vector & rhs)
{
p_arrays = new T[rhs.m_capacity];
m_size = rhs.m_size;
m_capacity = rhs.m_capacity;
for (int i = 0; i < m_size; ++i)
{
p_arrays[i] = rhs.p_arrays[i];
}
}
const my_vector & operator= (const my_vector & rhs);
T & operator[](int index)
{
return p_arrays[index];
}
int capacity() const
{
return m_capacity;
}
int size() const
{
return m_size;
}
void reserve(int newCapacity);
void resize(int newsize);
void push_back(const T & a);
~my_vector()
{
delete[] p_arrays;
}
private:
int m_size; //当前元素个数
int m_capacity; //当前容量
T* p_arrays; //内置数组
};
template <class T>
const my_vector<T> & my_vector<T>::operator=(const my_vector<T> & rhs)
{
if (this != rhs)
{
delete[] p_arrays; //释放原来的内置数组
p_arrays = new T[rhs.m_capacity];
m_size = rhs.m_size;
m_capacity = rhs.m_capacity;
for (int i = 0; i < m_size; ++i)
{
p_arrays[i] = rhs.p_arrays[i];
}
return *this;
}
}
template <class T>
void my_vector<T>::reserve(int newCapacity)
{
T* old_p = p_arrays;
int numToCopy = newCapacity > m_size ? m_size : newCapacity;
p_arrays = new T[newCapacity];
for (int i = 0; i < numToCopy; ++i)
{
p_arrays[i] = old_p[i];
}
m_size = numToCopy;
m_capacity = newCapacity;
delete[] old_p;
}
template <class T>
void my_vector<T>::resize(int newsize)
{
if (newsize > m_capacity)
{
reserve(2 * newsize + 1);
}
m_size = newsize;
}
template <class T>
void my_vector<T>::push_back(const T & a)
{
if (m_size == m_capacity)
{
reserve(2 * m_capacity + 1);
}
p_arrays[m_size++] = a;
}
#endif
注意:模板的声明和实现应该现在一个文件中,否则会出现连接错误:“无法解析的外部符号 该符号在函数 _main 中被引用”