指针向量的指针数组

时间:2013-11-22 19:45:28

标签: c++ arrays pointers vector

正如有人指出的那样,使用数组向量看起来通常比使用指针数组更合理;所以这里我有一个指针数组,我想将其转换为数组向量:

char ** ptr;    
char * ptrContiguous;

ptr = new char*[numChannels];
ptrContiguous = new char[x*y*byteSize*nC*nM*nZ*nT];
char * p = ptrContiguous;

for(int i = 0; i < numChannels; i++)
{
    ptr[i] = p;
    p += x*y*byteSize;                          

}

我的问题是:只有ptr需要转换为向量吗?有人可以编写一些简单的代码来说明数组到矢量转换吗?感谢。

2 个答案:

答案 0 :(得分:2)

这是您的实际代码:

char ** ptr;    
char * ptrContiguous;

ptr = new char*[numChannels];
ptrContiguous = new char[x*y*byteSize*nC*nM*nZ*nT];
char * p = ptrContiguous;

for(int i = 0; i < numChannels; i++)
{
    ptr[i] = p;
    p += x*y*byteSize;                          

}

现在,如果你使用STL中的vector,那么你的代码就变成了这个:

std::vector<std::string> ptr;
ptr.resize(numChannels);

std::string ptrContiguous;
ptrContiguous.resize(x*y*byteSize*nC*nM*nZ*nT);

const int part_size = x*y*byteSize;
for(int i = 0; i < numChannels; i++)
{
    ptr[i] = std::string(ptrContiguous.begin() + i * part_size, ptrContiguous.begin() + (i+1) * part_size);                          
}

此外,this link about vectorsabout strings可以为您提供帮助。这是我建议你的代码而不知道ptrContiguous的目的是什么。

答案 1 :(得分:1)

试试这个(为了代码清晰,重命名了一些变量,使用C风格的内存管理,因为这实际上是C代码,但如果您不熟悉mallocfree,请告诉我们):

char **short_strings; // short_strings[i] is the ith "short string"
char *long_string;

ptr = malloc(sizeof(char*) * num_short_strings);
long_string = malloc(sizeof(char) * num_short_strings * short_string_length);

char *p = long_string;

for(int i = 0; i < num_short_strings; i++)
{
    short_strings[i] = p;
    p += sizeof(char) * short_string_length;
}

请注意,C ++ new / delete或C风格mallocfree都不允许您释放short_strings[i]的内存(例如调用free(short_strings[i])delete[] short_strings[i]。这是因为这些动态内存分配器以块的形式分配内存,而freedelete只允许您删除您传递的整个块。如果您希望能够单独删除短字符串,则需要为每个短字符串重新分配内存,并strcpy等。