如何在C++中动态分配/增长字符串数组
How do I dynamically allocated/grow an array of strings in C++?
环顾四周,我发现了我认为可以解决问题的方法。现在我正在尝试读取一个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,将短语保存到数组短语。我想让我的程序读取一个行数未知的文件,所以我需要快速增长数组。现在,如果我使用被注释掉的数组,我的程序就会崩溃。
couts显示它正在读取前两行,然后崩溃,我想是因为数组不够长。有什么建议可以告诉我需要做哪些更改才能正确地扩展我的数组吗?
edit:我必须使用数组。我不能使用任何其他数据结构。
只需使用std::vector
。
例如,您可以使用push_back
方法将一个项目添加到std::vector
的末尾,使其增长。
CCD_ 4也比直接处理原始指针和CCD_。
如果您的讲师禁止使用std::string
以外的标准库容器,则使用std::vector
的几个相关功能来实现一个类。对于这样一个类来说,重要的是负责复制,在C++03时代被称为“规则3";。从本质上讲,由于它将处理动态内存分配和释放,因此需要一个析构函数,因此需要声明(并实现或设置为delete
)一个复制构造函数和一个复制赋值运算符。
在这个类中,当超过当前缓冲区大小时,分配一个新的缓冲区,复制旧的内容,取消分配旧的内容。避免O(n2)行为的一种常见方法是将缓冲区大小增加一些因子,而不仅仅是增加固定数量的项。每次只需将缓冲区大小增加一倍就足够了。
哦,是的,在内部使用智能指针是个好主意。
分配一个新数组。将旧数组复制到新数组。删除旧数组。
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移动语义。
- 将C#字符串数组传递给C++
- 如何为 C 型字符串数组编写 getter 和 setter?
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 尝试将 c 字符串数组与分隔符连接起来
- 将字符串数组传递给接受常量字符**的函数
- 返回 C++ 中的字符串数组
- 如何从COM模块中的函数返回字符串数组?
- 无法将字符串数组声明为类成员而不是字符 (C++)
- 删除字符串数组
- 如何将字符串数组返回到 java JNI
- 将字符串数组作为函数参数传递
- C++将字符串数组的元素存储到变量中
- 循环访问还包含未使用元素的字符串数组
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 乘以字符串/数组和全局数组
- 递归二进制搜索与字符串数组
- 如何初始化一个标准::字符串数组?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++字符串数组的动态向量
- 给定一个等长字符串数组