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

时间:2015-10-28 21:58:50

标签: c++ arrays pointers allocation

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

嘿所有,我正在为“三巨头”制作一个节目"并出现了问题。用户可以输入一次名称,然后他们可以输入他们注册的课程。他们可以输入任意数量的课程,但当他们输入"完成"时,他们会#39; ;重新输入内容,阵列应根据他们输入的课程数量来制作。

现在没有使用向量,我必须删除数组以释放资源,然后使用新大小重新创建它,因为用户进入另一个类,然后当他们完成时,它会复制这些临时课程到一个名为" 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];
        }       
    }

它刚刚打印出一个我已经输入到屏幕上的课程(因为删除了[]临时课程),但我不知道如何解决这个问题,因为我必须删除数组以制作一个更大的新数组。

任何信息表示赞赏!!感谢。

2 个答案:

答案 0 :(得分:0)

您过早删除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;
        }

答案 1 :(得分:0)

您的方法效率很低,因为每次输入新的string时重新分配并复制以前输入的所有 <{1>} 。这使得string个分配和n个副本,每个副本可能需要另一个分配(足够长n*(n-1)/2秒)。

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

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

添加到您的代码中
string