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

时间:2019-04-17 14:54:35

标签: c++ arrays vector

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

::std::vector<int> i;
i.push_back(100);
i.push_back(10);

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

int* v = i.data();

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

free(/*everything from ::std::vector but the list*/);

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

预先感谢, 杰克

4 个答案:

答案 0 :(得分:6)

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

i.shrink_to_fit();
int* v = i.data();

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

int *v = new int[i.size];
memcpy(v, i.data, i.size * sizeof(int));
i.clear();

但是我真的怀疑您会以这种方式获得重大收获...

答案 1 :(得分:5)

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

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

保存内存的唯一额外预防措施是使用shrink_to_fit()释放用作备用容量的所有多余内存(尽管不能保证)。

答案 2 :(得分:1)

您有两个选择:

  1. 将数据保留在矢量中,但调用shrink_to_fit。您将拥有的所有开销-是一个额外的指针(指向向量端)。自C ++ 11起可用
  2. 将数据复制到外部数组并销毁矢量对象:

这里是示例:

std::vector<int> vec;
// fill vector
std::unique_ptr<int[]> arr(new int[vec.size()]);
std::copy(vec.begin(), vec.end(), arr.get());

答案 3 :(得分:-5)

好的,感谢致力于此工作的每个人,我提出了以下解决方案:

auto v = new ::std::vector<int>();
// fill the vector
v->shrink_to_fit();
int* g = v->data();
free(v); // will free the memory the vector occupies, but not that of the array, since it does not call the destructor

如果我遇到过一个:: std :: vector分配比数组更多的实现的情况,那么我只会#if并释放相应的地址。

感谢您的帮助, 杰克