c++ - 尝试在 vector 类中创建调整大小函数

标签 c++ vector dynamic-allocation

我正在制作复制功能 here ,得到了很多好的答案,现在继续调整大小功能。我正在处理的 Vec 类如下所示:

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);
void swap(Vec<T>& left, Vec<T>& right);
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) {
Vec<T> temp = v;
swap(*this, temp);
return *this;
}

//swap one vector with another
template <class T> void Vec<T>::swap(Vec<T>& left, Vec<T>& right) {
std::swap(left.m_size, right.m_size);
std::swap(left.m_alloc, right.m_alloc);
std::swap(left.m_data, right.m_data);
}

到目前为止,这是调整大小函数的样子:

template <class T> void Vec<T>::resize(size_type n, const T& fill_in_value) {
if (n<=m_size) {     //if resize is smaller than original size, just resize
    m_size = n;
}

else {               //if resize is bigger, assign more space at the end and fill with a value
    size_type temp = m_size;
    m_size = n;
    //for (T* p = m_data; p != m_data + temp; ++p) {
    //  std::cout << p << std::endl;
    //}
    //std::cout << std::endl;

    for (T* p = &m_data[0] + temp; p != m_data + m_size; ++p) {
    //  std::cout << p << std::endl;
        *p = fill_in_value;
    }       
}   

}

当我在程序中使用它时,出现段错误。我猜有什么问题:

*p = fill_in_value

所以我打印出 p 的值,它似乎为我输入的任何内容提供了适当数量的空格( double 为 8 位,等等),所以从 vector 的开头就有确切的空格数调整大小,它们都有正确的位数。我在这里不明白什么?

编辑:如果我改变它:

        m_size = m_alloc = n;

这是否意味着我正在为其余数据分配新内存?或者我应该创建一个具有新大小的临时 vector 并用它替换现有 vector 吗?我真的不明白如何纠正我没有真正调整大小,而只是越界访问的问题。到目前为止,我理解它的方式是更改大小,在末尾向内存地址添加内容,但将指向第一个值的指针保持不变( vector 的名称)。这不起作用,所以我想知道我的概念误解是什么。

EDIT2:我已经根据此处的答案对代码进行了此更正并且它有效:

template <class T> void Vec<T>::resize(size_type n, const T& fill_in_value) {
if (n<=m_size) {
    m_size = m_alloc = n;
}

else {
    T* new_data = new T[n];
    for (size_type i = 0; i < m_size; i++) {
        new_data[i] = m_data[i];
    }
    for (size_type i = m_size; i < n; i++) {
        new_data[i] = fill_in_value;
    }
    delete m_data;
    m_data = new_data;
    m_size = m_alloc = n;               
}           


}

最佳答案

您实际上并没有为新元素分配空间。当新尺寸大于当前尺寸时,您应该分配新存储并将现有元素复制到那里。

T* new_data = new T[n];
for ( size_type i = 0; i < m_size; ++i )
{
    new_data[i] = m_data[i];
}
for ( size_type i = m_size; i < n; ++i )
{
    new_data[i] = fill_in_value;
}
delete m_data;
m_data = new_data;
m_size = n;

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

相关文章:

c++ - 如何使用参数化构造函数动态分配对象数组?

C++ 动态分配的内存在崩溃或强制退出后返回?

c++ - 将 POCO 静态库嵌入另一个

c++ - <regex> VS10 中文件名的正则表达式格式有什么问题?

R使用向量创建新列包含变量名称

math - 向量数量不同的两个图节点之间的余弦相似度计算

C 矩阵和 vector 的动态分配

c++ - 可变参数模板的 N 元笛卡尔积

c++ - 测试 "Singleton with new and delete (C++)"时的问题

c++ - 将本地 std::vector 分配给 C++ 中的引用