C++ 动态字符串数组分配
c++ dynamic string array allocation
在我开始之前,我应该提到我不能在这个程序中使用矢量。
大家好,我正在为 "The Big Three" 编写程序,但遇到了问题。用户可以在那里输入一次名称,然后他们可以输入他们注册的课程。他们可以输入任意多的课程,但是当他们输入 "done" 时,他们就完成了输入,并且数组应该根据他们输入的课程数量来制作。
现在不使用矢量,我必须删除数组以释放资源,然后使用新大小重新创建它,因为用户输入了另一个 class,然后当他们完成时,它将这些 tempCourses 复制到一个名为 "vals".
的数组字符串指针中
这是我遇到问题的方法:
void Student::getStudentInput()
{
cout << "Enter Student name: ";
cin >> this->name;
string *tempCourses;
tempCourses = new string[];
stringstream strStream;
string x = "";
int numcourses = 0;
while (x.compare("done") != 0)
{
cout << "Enter a new Course: ";
cin >> x;
cout << " " << endl;
if (x.compare("done") != 0)
{
delete[] tempCourses;
numcourses++;
tempCourses = new string[numcourses];
for (int i = 0; i < numcourses; i++)
{
tempCourses[i] = x;
x = "";
}
}
}
this->size = numcourses;
vals = new string[size];
for (int i = 0; i < size; i++)
{
vals[i] = tempCourses[i];
}
}
它只是打印出我在屏幕上输入的一门课程(因为 delete[] tempCourses),但我不确定如何解决这个问题,因为我必须删除数组才能做一个更大尺寸的新的。
欢迎提供任何信息!!谢谢
您删除 tempCourses
太早了。更改代码如下:
if (x.compare("done") != 0)
{
auto newCourses = new string[numcourses+1];
for (int i = 0; i < numcourses; i++)
{
newCourses[i] = tempCourses[i];
}
newCourses[numcourses++] = x;
delete[] tempCourses;
tempCourses = newCourses;
}
你的方法效率很低,因为你重新分配和复制所有之前输入的string
s 每次一个输入新 string
。这使得它 n
分配和 n*(n-1)/2
副本,每个都可能需要另一个分配(足够长的 string
s)。
相比之下,std::vector
(您正在躲避)在每次内存不足时将分配的内存加倍。虽然这可能会浪费一些内存,但它避免了许多重新分配和复制。此外,std::vector
还通过 移动 来避免复制 string
。
后一种优化实际上很容易通过
添加到您的代码中
newCourses[i] = std::move(tempCourses[i]);
在我开始之前,我应该提到我不能在这个程序中使用矢量。
大家好,我正在为 "The Big Three" 编写程序,但遇到了问题。用户可以在那里输入一次名称,然后他们可以输入他们注册的课程。他们可以输入任意多的课程,但是当他们输入 "done" 时,他们就完成了输入,并且数组应该根据他们输入的课程数量来制作。
现在不使用矢量,我必须删除数组以释放资源,然后使用新大小重新创建它,因为用户输入了另一个 class,然后当他们完成时,它将这些 tempCourses 复制到一个名为 "vals".
的数组字符串指针中这是我遇到问题的方法:
void Student::getStudentInput()
{
cout << "Enter Student name: ";
cin >> this->name;
string *tempCourses;
tempCourses = new string[];
stringstream strStream;
string x = "";
int numcourses = 0;
while (x.compare("done") != 0)
{
cout << "Enter a new Course: ";
cin >> x;
cout << " " << endl;
if (x.compare("done") != 0)
{
delete[] tempCourses;
numcourses++;
tempCourses = new string[numcourses];
for (int i = 0; i < numcourses; i++)
{
tempCourses[i] = x;
x = "";
}
}
}
this->size = numcourses;
vals = new string[size];
for (int i = 0; i < size; i++)
{
vals[i] = tempCourses[i];
}
}
它只是打印出我在屏幕上输入的一门课程(因为 delete[] tempCourses),但我不确定如何解决这个问题,因为我必须删除数组才能做一个更大尺寸的新的。
欢迎提供任何信息!!谢谢
您删除 tempCourses
太早了。更改代码如下:
if (x.compare("done") != 0)
{
auto newCourses = new string[numcourses+1];
for (int i = 0; i < numcourses; i++)
{
newCourses[i] = tempCourses[i];
}
newCourses[numcourses++] = x;
delete[] tempCourses;
tempCourses = newCourses;
}
你的方法效率很低,因为你重新分配和复制所有之前输入的string
s 每次一个输入新 string
。这使得它 n
分配和 n*(n-1)/2
副本,每个都可能需要另一个分配(足够长的 string
s)。
相比之下,std::vector
(您正在躲避)在每次内存不足时将分配的内存加倍。虽然这可能会浪费一些内存,但它避免了许多重新分配和复制。此外,std::vector
还通过 移动 来避免复制 string
。
后一种优化实际上很容易通过
添加到您的代码中newCourses[i] = std::move(tempCourses[i]);