【问题标题】:array of pointers to vector of pointers指向指针向量的指针数组
【发布时间】:2013-11-22 19:45:28
【问题描述】:

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

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 需要转换为向量,对吗?有人可以写一些简单的代码来说明数组到向量的转换吗?谢谢。

【问题讨论】:

  • 最好将其转换为字符串向量 - std::vector&lt;std::string&gt;
  • @DanielKamilKozar:你能写一些真正有用的简单代码吗?谢谢。
  • @NickXTsui std::vector&lt;std::string&gt; myvec( ptr, ptr+numChannels);
  • @KitsuneYMG 那么其余的都一样吗?如何执行 for 循环以在 myvec 的意义上分配 ptr[i]?
  • 而且 ptr 应该仍然保留为 char** 吗?我认为重点是使用向量来替换 char*[]

标签: c++ arrays pointers vector


【解决方案1】:

这是您的实际代码:

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 中的向量,您的代码将变为以下代码:

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 的目的的情况下建议您的代码。

【讨论】:

  • 非常感谢。但是我以前用的函数delete ptr[i],或者return ptr[i],这些都返回错误,好像string to char*有问题?
  • @NickXTsui 带有向量和字符串,您不需要删除和新建。如果你想返回ptr[i],那么你的函数定义应该是这种形式:std::string getPtrAtPosi(/*something here maybe*/) { ... }。如果要返回ptr,函数应该是这样的形式:std::vector&lt;std::string&gt; getPtrAtPosi(/*something here maybe*/) { ... }
  • 我的指针指向 char*。基本上是一块代表图像的缓冲区。那么 std::string 可以表示图片吗?
  • @NickXTsui 如果你真的想要一个字节向量(值在 0 和 255 之间),在这种情况下,我建议你使用 std::vector&lt;unsigned char&gt; 而不是 std::string
【解决方案2】:

试试这个(为了代码清晰重命名了一些变量,使用 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 等。

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2021-02-07
    • 2016-07-30
    相关资源
    最近更新 更多