【发布时间】:2014-10-17 12:49:53
【问题描述】:
我正在实现一个向量类,但不知道如何编写一个函数来将一个向量复制到另一个向量中。
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];
}
我猜这不是完全正确或好的形式。我不知道。现在我得到一个关于指针被释放但没有被分配的错误(但它至少现在可以成功编译、运行和复制向量)。所以我想说我并不真正理解通过引用传递变量/数组/向量/事物,以及内存的动态分配。我的问题是:如何改进我编写的复制函数,以不比较两个不兼容的变量,或者成功地将指针动态分配给新向量,以免出现 malloc 错误?
【问题讨论】:
-
您无需致电
size()。在复制构造函数中,您可以访问参数的私有变量,所以m_size = m_alloc = v.m_size就可以了。其次,不要做m_data = &v;。您应该复制缓冲区,而不是参考。 -
你所做的不是复制一个向量,你是共享>一个向量(这可能会在以后导致双释放和分段错误)。如果您想实际复制一个向量,您需要分配内存并复制所有元素(例如,
std::copy)。 -
如果你真的想复制一个向量,你可以简单地清除
this,然后在循环中为向量v中的每个元素调用push_back()。 -
您的
operator=有问题。您删除了m_data,因此如果尝试再次分配内存时抛出异常,您的this已损坏。
标签: c++ vector pass-by-reference dynamic-allocation