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;
        }

你的方法效率很低,因为你重新分配和复制所有之前输入的strings 每次一个输入新 string。这使得它 n 分配和 n*(n-1)/2 副本,每个都可能需要另一个分配(足够长的 strings)。

相比之下,std::vector(您正在躲避)在每次内存不足时将分配的内存加倍。虽然这可能会浪费一些内存,但它避免了许多重新分配和复制。此外,std::vector 还通过 移动 来避免复制 string

后一种优化实际上很容易通过

添加到您的代码中
newCourses[i] = std::move(tempCourses[i]);