我想在运行时增长:: 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)
有人可以给我一些指导吗?
预先感谢,杰克
在我所看到的所有实现中,向量的分配部分是...数组本身。如果您知道它不再增长,则可以尝试缩小它,以释放可能未使用的内存:
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)
但我真的怀疑您会通过这种方式获得重大收益...
您可以将a的内容std::vector用作C数组,而无需复制或释放任何内容。只要确保没有std::vector超出您的指针有效的需求(并且对向量本身进行了可能触发重新分配的进一步修改)。
当您获得指向内部存储的指针时,data()实际上并没有分配任何内容,只是引用已经分配的内存。
您可以用来节省内存的唯一额外预防措施是shrink_to_fit()释放任何多余的内存以用作备用容量(尽管不能保证)。