如何在C ++中动态分配/增长字符串数组?

时间:2015-02-05 23:02:25

标签: c++ dynamic-arrays

环顾四周,我发现了我认为可以解决问题的方法。现在我正试图从txt文件中读取。

来自文件的

片段:

11111,"随机短语"

11123,"这是胡说八道"

13212,"愚蠢的话语"

int arraylen = 2;
string line, field;
string* num = new string[arraylen];
string* phrase = new string[arraylen];


ifstream myfile;
myfile.open("data.txt");




int i = 0, test = 0;


while(!myfile.eof())
{
    getline(myfile,line);
    stringstream ss(line);
    while(getline(ss,field,','))
    {
        if(test == 0)
        {
            num[i] = field;
            cout << "rum: " << num[i] << endl;
            test = 1;

        }
        else
        {
            phrase[i] = field;
            cout << "phrase: " << phrase[i] << endl;
            test = 0;               
        }

        if(i == (arraylen-1))
        {
            arraylen = arraylen + 1;
            string* temp = new string[arraylen];
            copy(num, num + 2, temp);
            delete [] num;
            num = temp;
            copy(phrase, phrase + 2, temp);
            delete [] phrase;
            phrase = temp;

        }


    }
    i++;
}
myfile.close();




return 0;

我用逗号分析行并将数字保存到数组num,将短语保存到数组短语。我想允许我的程序读取一个行数未知的文件,所以我需要动态增长数组。现在如果我使用被注释掉的数组我的程序崩溃了。

cout显示它正在读取前两行然后崩溃我假设因为阵列不够长。有关需要进行哪些更改的任何建议,以便我可以正确地扩展我的阵列?

编辑:我必须使用数组。我不能使用任何其他数据结构。

2 个答案:

答案 0 :(得分:2)

只需使用std::vector

E.g。您可以使用std::vector方法将项​​目添加到push_back的末尾,并将其增长。

std::vector比直接处理原始指针和new更安全,更容易。


如果您的教师禁止使用std::string以外的标准库容器,请使用std::vector的相关少数功能实现一个类。对于这样一个类来说,重要的是负责复制,在C ++ 03天中称为“3规则”。本质上,由于它将处理动态内存分配和释放,因此您需要一个析构函数,因此您需要声明(并实现或设置为delete)复制构造函数和复制赋值运算符。

在此类中,当超出当前缓冲区大小时,分配新缓冲区,复制旧内容,取消分配旧内容。避免O(n 2 )行为的常用方法是通过某些因子来增加缓冲区大小,而不仅仅是通过固定数量的项目。每次只需将缓冲区大小加倍就足够了。

哦,是的,在内部使用智能指针是一个好主意。

答案 1 :(得分:1)

分配新阵列。将旧数组复制到新数组。删除旧数组。

void reallocate(std::string** old_arr, int old_size, int new_size)
{
    std::string* new_arr = new std::string[new_size];
    for (int i = 0; i < old_size; ++i)
        new_arr[i] = (*old_arr)[i];

    delete[] *old_arr;
    *old_arr = new_arr;
}

这只是因为您无法使用评论中指定的std::vector。下一个选项是使用std::unique_ptr但是meh ..想法很简单,当你分配新数组时,将new_size指定为old_size * 2 ..这通常是std::vector所做的。

请注意,此处的代码不是异常安全的,并且忽略了C ++ 11移动语义。