zeb*_*man 0 c++ pointers dynamic char
我正在尝试使用一系列char指针.
假设我动态地声明这样的数组:
int numrows=100;
char** array = new char*[numrows];
Run Code Online (Sandbox Code Playgroud)
然后我通过使用getline从文件中获取字符串,将字符串转换为char数组,然后在我的数组中设置指针指向所述char数组来填充它,如下所示:
string entry;
int i=0;
while (getline(file,entry)){
char* cstring = new char[entry.length()];
array[i]=strncpy(cstring,entry.c_str(),entry.length());
free(cstring);
i++;
}
Run Code Online (Sandbox Code Playgroud)
(这有效,但是有更好的方法吗?)
问题是,一旦我变得大于numrows,我不知道如何增长数组.我知道如何为一维数组做这个,但是二维性让我失望.
我想我应该能够像增长一维阵列一样成长它,对吗?
if (i==numrows){
char** temp = new char*[numrows+numrows];
for (int j=0;j<i;j++){
char* cstring = new char[strlen(array[i])];
temp[i]=strncpy(cstrin,array[i],strlen(array[i]));
free(cstring);
}
delete [] array;
array = temp;
}
Run Code Online (Sandbox Code Playgroud)
因此,如果当前数组变满,则创建第二个数组,该数组的大小是当前数组的两倍,并用当前数组的内容填充它.然后删除数组,让数组指向temp.我很高兴让temp成为新阵列.我可以将数组的内容转换为temp,但是当我删除数组并设置array = temp时,数组的内容不是temp的内容.
所以我的问题是我怎样才能/应该发展这个动态数组的char指针?
使用std :: vector - 这是你的朋友
std::vector<std::string> arr;
while(getline(file, entry))
{
arr.push_back(entry);
}
Run Code Online (Sandbox Code Playgroud)
DONE
可以使用带自定义比较的矢量排序来完成排序
bool less3(const std::string &s1, const std::string &s2)
{
return s1.compare(0, 3, s2, 0, 3) == 0;
}
std::sort(arr.begin(), arr.end(), less3);
Run Code Online (Sandbox Code Playgroud)
我敢打赌,less3可以提高效率,但可读性会赢,除非你真的受苦
编辑固定根据gman的好评