C++ c++;动态字符串数组分配

C++ c++;动态字符串数组分配,c++,arrays,pointers,allocation,C++,Arrays,Pointers,Allocation,在开始之前,我应该提到,我不能在这个程序中使用向量 嘿,大家好,我正在为“三巨头”制作一个节目,遇到了一个问题。用户可以输入该名称一次,然后键入他们注册的课程。他们可以输入任意数量的课程,但当他们输入“完成”时,他们就完成了输入,数组应该根据他们输入的课程数量来制作 现在,在不使用向量的情况下,我必须删除数组以释放资源,然后使用新的大小重新创建它,因为用户进入了另一个类,然后当它们完成时,它将这些tempCourses复制到一个名为“vals”的数组字符串指针中 以下是我遇到困难的方法:

在开始之前,我应该提到,我不能在这个程序中使用向量

嘿,大家好,我正在为“三巨头”制作一个节目,遇到了一个问题。用户可以输入该名称一次,然后键入他们注册的课程。他们可以输入任意数量的课程,但当他们输入“完成”时,他们就完成了输入,数组应该根据他们输入的课程数量来制作

现在,在不使用向量的情况下,我必须删除数组以释放资源,然后使用新的大小重新创建它,因为用户进入了另一个类,然后当它们完成时,它将这些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
的内容在重新分配之前被删除。@GregMiller
auto
并不意味着自动删除。不要使用原始指针或
new
delete
,很简单。啊,好的,谢谢你的帮助guys@GregMillerasπάνταῥεῖ 提到的
auto
表示“从=”右侧的表达式推断类型”