c++ - 尝试在 vector 类中创建复制函数

标签 c++ vector pass-by-reference dynamic-allocation

我正在努力实现一个 vector 类,但不知道如何编写一个函数来将一个 vector 复制到另一个 vector 中。

template <class T> class Vec {

public:
//TYPEDEFS
    typedef T* iterator;
    typedef const T* const_iterator;
    typedef unsigned int size_type;

//CONSTRUCTOS, ASSIGNMENT OPERATOR, & DESTRUCTOR
    Vec() {this->create(); }
    Vec(size_type n, const T& t = T()) { this->create(n, t); }
    Vec(const Vec& v) { copy(v); }
    Vec& operator=(const Vec& v);
    ~Vec() { delete [] m_data; }

//MEMBER FUNCTIONS AND OTHER OPERATORS
    T& operator[] (size_type i) { return m_data[i]; }
    const T& operator[] (size_type i) const { return m_data[i]; }
    void push_back (const T& t);
    iterator erase(iterator p);
    void resize(size_type n, const T& fill_in_value = T());
    void clear() { delete [] m_data; create(); }
    bool empty() const { return m_size == 0; }
    size_type size() const { return m_size; }

//ITERATOR OPERATIONS
    iterator begin() { return m_data; }
    const_iterator begin() const { return m_data; }
    iterator end() { return m_data + m_size; }
    const_iterator end() const { return m_data + m_size; }

private:
//PRIVATE MEMBER FUNCTIONS
    void create();
    void create(size_type n, const T& val);
    void copy(const Vec<T>& v);

//REPRESENTATION
    T *m_data;      //point to first location inthe allocated array
    size_type m_size;   //number of elements stored in the vector
    size_type m_alloc;  //number of array locations allocated, m_size <= m_alloc
};

//create an empty vector (null pointers everywhere)
template <class T> void Vec<T>::create() {
    m_data = NULL;
    m_size = m_alloc = 0;   //no memory allocated yet
}

//create a vector with size n, each location having the given value
template <class T> void Vec<T>::create(size_type n, const T& val) {
    m_data = new T[n];
    m_size = m_alloc = n;
    for (T* p = m_data; p != m_data + m_size; ++p)
        *p = val;
}   

//assign one vector to another, avoiding duplicate copying
template <class T> Vec<T>& Vec<T>::operator=(const Vec<T>& v) {
    if (this != &v) {
        delete [] m_data;
        this -> copy(v);
    }
    return *this;
}

这是我想到的第一件事:

template <class T> void Vec<T>::copy(const Vec<T>& v) {

     m_size = m_alloc = v.size();
     m_data = &v;

}

我收到关于不兼容类型的错误...好吧,它们不兼容是有道理的。所以我取出'const',现在它起作用了。

template <class T> void Vec<T>::copy(Vec<T>& v) {

     m_size = m_alloc = v.size();
     m_data = &v[0];

}

我猜这不是完全正确或好的形式。我不知道。现在我得到一个关于指针被释放但没有被分配的错误(但它至少现在成功地编译、运行和复制 vector )。所以我想说我并不是真的理解通过引用传递变量/数组/vector/事物,以及内存的动态分配。我的问题是:如何改进我编写的复制函数,使其不比较两个不兼容的变量,或者成功地将指针动态分配给新 vector ,这样我就不会出现 malloc 错误?

最佳答案

您需要对元素进行深拷贝,而不是简单地分配指针m_data:

// precondition: `m_data` is not allocated
template <class T> void Vec<T>::copy(const Vec<T>& v) {
    m_data = new T[v.size()];
    m_size = m_alloc = v.size();
    for (size_t ii = 0; ii < m_size; ++ii)
        m_data[ii] = v[ii];
}

关于c++ - 尝试在 vector 类中创建复制函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25467801/

相关文章:

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

c++ - 一个函数使用多少内存?

c++ - std::vector 数组的大小

c++ - 提升截止时间计时器我的代码没有同时运行

vector - 为什么无法在 Scheme 中调整 SRFI-4 向量的大小?

r - 区分向量和 R 中的矩阵

C++字符串修改,不通过引用传递?

c++ - 从透视到正交投影

c++ - 遍历映射 vector ,并在满足条件时插入拷贝

c++ - 在类成员函数中获取引用并将其分配给 C++ 中的类数据成员(引用)