如何解决创建一个自定义矢量类 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];
}
,
有一些问题。
-
看起来好像不需要特殊情况来处理0尺寸的向量
-
您没有分配足够的内存:
例如,如果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]```
-
循环后您将超出范围。如果分配[size]个字节,则(size-1)是最后一个有效索引。
-
您将数据复制到temp,然后将温度复制到另一个分配。您不需要这样做。只需分配this-> data = temp;整个第二循环是不必要的,并且不要在最后删除temp。
许多new
和delete
操作和循环都没有必要。我修复并清理了您的两个功能。
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)的末尾。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。