创建一个自定义矢量类 Push_back函数仅适用于第一个值

问题描述

在我的Comp Sci类中,我们正在学习如何制作自己的向量类。最终,我们将定制的字符串类对象存储在定制的向量类中。为了简单起见,我想先构建一个整数向量类。

到目前为止,我有一个认的构造函数,该构造函数将指向空数组的指针初始化并将大小设置为0。然后,我尝试使用push_back函数附加一些值,然后检查以确保正确完成了操作。 >

当我执行std :: cout

我得到正确的输出(10)。但是,如果我再次调用push_back然后再调用v [1],我将得到0。

我觉得我在push_back函数中没有正确分配内存,但是我不确定。

感谢您的任何建议!

[第1部分] [1]

[第2部分] [2]

对不起,如果我的格式错误,我是新来的。

班级:

class myVector
{
private:
    int *data; //will point to an array of ints
    size_t size; //determins the size of array
public:
    myVector(); // default constructor
    void push_back(int); // appends an integer to the vector
    int operator[](size_t);
    size_t sizeOf();
};

主要:

int main()
{
    myVector v;
    v.push_back(10);
    std::cout << v.sizeOf() << std::endl;
    v.push_back(14);
    std::cout << v.sizeOf() << std::endl;
    std::cout << v[1] << std::endl;

    return 0;

}

成员函数

size_t myVector::sizeOf()
{
    return size;
}

int myVector::operator[](size_t location)
{
    return this->data[location]; //this will return the value at data + 
                                 //location
}

myVector::myVector()
{
    this->data = new int[0]; //initialize the data to an empty array of 
                             //ints
    size = 0; //initialize the size to 0
}

void myVector::push_back(int val)
{
    if(size == 0) //if size == 0,create a new array with 1 extra index
    {
        ++size;
        delete [] this->data;
        this->data = new int[size];
        this->data[0] = val;
    }
    else
    {
         ++size;
         int *temp = new int[size - 1];
         for(int i = 0; i != (size - 1); i++)
         {
              temp[i] = this->data[i];
         }
         delete [] this->data;
         this->data = new int[size];
         for(int i = 0; i != (size - 1); i++)
         {
             this->data[i] = temp[i];
         }
         this->data[size] = val;
         delete [] temp;
    }
}

解决方法

在您的代码中:

this->data[size] = val;

您正在分配的数组之外。

与上一个循环相同(在上一个循环中):

 for(int i = 0; i != (size - 1); i++)
 {
     this->data[i] = temp[i];
 }
,

有一些问题。

  1. 看起来好像不需要特殊情况来处理0尺寸的向量

  2. 您没有分配足够的内存:

例如,如果size为1,则遇到这种情况,然后size变为2,并为...分配一个缓冲区1.。

else
{
     ++size;
     int *temp = new int[size - 1];
     for(int i = 0; i != (size - 1); i++)
     {
         temp[i] = this->data[i];
     }

Tip: use ```for (int i = 0; i < size; ++i)```  and ```new int[size]```
  1. 循环后您将超出范围。如果分配[size]个字节,则(size-1)是最后一个有效索引。

  2. 您将数据复制到temp,然后将温度复制到另一个分配。您不需要这样做。只需分配this-> data = temp;整个第二循环是不必要的,并且不要在最后删除temp。

,

许多newdelete操作和循环都没有必要。我修复并清理了您的两个功能。

myVector::myVector()
{
    this->data = new int[1]; //initialize the data to an empty array of 
                             //ints
    size = 0; //initialize the size to 0
}

void myVector::push_back(int val)
{
    if(size == 0) //if size == 0,create a new array with 1 extra index
    {
        ++size;
        this->data[0] = val;
    }
    else
    {
         ++size;
         int *temp = new int[size];
         for(int i = 0; i != (size-1); ++i)
         {
              temp[i] = this->data[i];
         }
         delete [] this->data;
         this->data = temp;
         this->data[size-1]=val;
    }
}
push_back函数中的

分配一个具有新大小的新数组,并从现有数组中复制数据。删除现有数组后,我们看到this->data无法指向有效位置。将新数组的地址分配给this->data,我们将访问现有数据,并且大小增加+1。最后,我们将参数val分配给array(size-1)的末尾。