使用:: std :: vector进行数组创建

the*_*ack 0 c++ arrays vector

我想在运行时增长:: std :: vector,像这样:

::std::vector<int> i;
i.push_back(100);
i.push_back(10);
Run Code Online (Sandbox Code Playgroud)

在某些时候,向量已经完成,并且我不需要额外的功能:: std :: vector可以提供更多的功能,因此我想将其转换为C数组:

int* v = i.data();
Run Code Online (Sandbox Code Playgroud)

因为我将不止一次这样做,所以我想释放所有保留的堆内存:: std :: vector,但是我想保留数据,就像那样(伪代码):

free(/*everything from ::std::vector but the list*/);
Run Code Online (Sandbox Code Playgroud)

有人可以给我一些指导吗?

预先感谢,杰克

Ser*_*sta 6

在我所看到的所有实现中,向量的分配部分是...数组本身。如果您知道它不再增长,则可以尝试缩小它,以释放可能未使用的内存:

i.shrink_to_fit();
int* v = i.data();
Run Code Online (Sandbox Code Playgroud)

当然,没有任何东西可以保证实现会做任何事情,但是唯一的安全选择是分配一个新数组,将数据从向量移到该数组并清除向量。

int *v = new int[i.size];
memcpy(v, i.data, i.size * sizeof(int));
i.clear();
Run Code Online (Sandbox Code Playgroud)

但我真的怀疑您会通过这种方式获得重大收益...


Jac*_*ack 5

您可以将a的内容std::vector用作C数组,而无需复制或释放任何内容。只要确保没有std::vector超出您的指针有效的需求(并且对向量本身进行了可能触发重新分配的进一步修改)。

当您获得指向内部存储的指针时,data()实际上并没有分配任何内容,只是引用已经分配的内存。

您可以用来节省内存的唯一额外预防措施是shrink_to_fit()释放任何多余的内存以用作备用容量(尽管不能保证)。