C++ c++;动态字符串数组分配
在开始之前,我应该提到,我不能在这个程序中使用向量 嘿,大家好,我正在为“三巨头”制作一个节目,遇到了一个问题。用户可以输入该名称一次,然后键入他们注册的课程。他们可以输入任意数量的课程,但当他们输入“完成”时,他们就完成了输入,数组应该根据他们输入的课程数量来制作 现在,在不使用向量的情况下,我必须删除数组以释放资源,然后使用新的大小重新创建它,因为用户进入了另一个类,然后当它们完成时,它将这些tempCourses复制到一个名为“vals”的数组字符串指针中 以下是我遇到困难的方法:C++ c++;动态字符串数组分配,c++,arrays,pointers,allocation,C++,Arrays,Pointers,Allocation,在开始之前,我应该提到,我不能在这个程序中使用向量 嘿,大家好,我正在为“三巨头”制作一个节目,遇到了一个问题。用户可以输入该名称一次,然后键入他们注册的课程。他们可以输入任意数量的课程,但当他们输入“完成”时,他们就完成了输入,数组应该根据他们输入的课程数量来制作 现在,在不使用向量的情况下,我必须删除数组以释放资源,然后使用新的大小重新创建它,因为用户进入了另一个类,然后当它们完成时,它将这些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];
}
}
void Student::getStudentInput()
{
cout>这个->名字;
串*临时课程;
tempCourses=新字符串[];
stringstream和strStream;
字符串x=“”;
int numcourses=0;
而(x.compare(“done”)!=0)
{
cout>x;
cout您删除的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;
}
if(x.compare(“done”)!=0)
{
auto newCourses=新字符串[numcourses+1];
for(int i=0;i
您的方法效率很低,因为每次输入新的字符串时,您都会重新分配和复制以前输入的所有字符串s。这使得n
分配和n*(n-1)/2个副本,每个副本可能需要另一次分配(足够长的字符串s)
相比之下,std::vector
(您正在避开的)在每次内存耗尽时将分配的内存翻一番。虽然这可能会浪费一些内存,但它避免了多次重新分配和复制。此外,std::vector
还通过移动字符串来避免复制字符串
后一种优化实际上很容易通过添加到代码中
newCourses[i] = std::move(tempCourses[i]);
<代码> TimeStudio =新字符串[];< /C> >无效c++ῥεῖ, ::rollseyes::我不认为at是一种叫喊,但作为一种确保我们注意的noobie。@Gread.And.power.Oz好吧,所有大写字母都被认为是叫喊,有更好的方法来强调标记中的内容。如果你认为这可以改进,只需编辑。过多的眼睛转动可能会导致其中一个或两个字母从指定的位置掉落。@πάνταῥεῖ, lmao。已经完成了编辑。正在审阅。谢谢!现在效果很好。没有想到其他数组。虽然新课程不需要删除吗?还是自动删除?我从未使用过“自动”在之前。@GregMiller,不,newCourses
不需要删除,因为它被分配给tempCourses
,并且以前分配给tempCourses
的内容在重新分配之前被删除。@GregMillerauto
并不意味着自动删除。不要使用原始指针或new
delete
,很简单。啊,好的,谢谢你的帮助guys@GregMillerasπάνταῥεῖ 提到的auto
表示“从=”右侧的表达式推断类型”