c++学习--模板--实现my_vector

主要练习模板的使用
代码如下:

#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 中被引用

猜你喜欢

转载自blog.csdn.net/werweqg/article/details/44027659