C++ 使用::std::vector创建数组

C++ 使用::std::vector创建数组,c++,arrays,vector,C++,Arrays,Vector,我想在运行时生成一个::std::vector,如下所示: ::std::vector<int> i; i.push_back(100); i.push_back(10); 因为我将不止一次这样做,所以我想取消分配所有保留的heap memory::std::vector,但我想保留数据,就像伪代码一样: free(/*everything from ::std::vector but the list*/); 有人能给我一些建议吗 提前感谢,, Jack您可以将std::vec

我想在运行时生成一个::std::vector,如下所示:

::std::vector<int> i;
i.push_back(100);
i.push_back(10);
因为我将不止一次这样做,所以我想取消分配所有保留的heap memory::std::vector,但我想保留数据,就像伪代码一样:

free(/*everything from ::std::vector but the list*/);
有人能给我一些建议吗

提前感谢,,
Jack

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

当您通过数据获取指向内部存储的指针时,实际上并没有分配任何内容,只是指已经分配的内存

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

您有两种选择:

将数据保存在向量中,但调用。您将拥有的所有开销-都是指向向量端的额外指针。它是从C++ 11中提供的 将数据复制到外部阵列并销毁向量对象: 以下是一个例子:

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

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

i.shrink_to_fit();
int* v = i.data();
当然,没有什么可以保证实现会做任何事情,但唯一简单的替代方法是分配一个新数组,将数据从向量移动到数组并清除向量

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

但是我真的很怀疑这样做是否会有很大的好处……

为什么不保留并使用向量呢?它让生活变得简单。int*不是数组什么内存?为什么您认为使用C样式数组可以节省内存?您是否提前知道向量将包含多少元素?如果是,请使用std::vector::reserve,这样就不会浪费内存。数据是std::vector分配的唯一堆内存。其余部分存储在对象本身中,无法释放。您可能希望使用来减少未使用的容量。shrink_to_fit是不具有约束力的,它的作用取决于实现。您应该指出,不仅std::vector必须比std::vector更长寿,而且舒尔必须确保不允许对vector进行任何修改。添加单个对象会导致重新定位,这也会导致指针无效。我实际上暗示,因为这是OP断言之一,所以他在某个点上完成了向量。但我会详细说明的。
int *v = new int[i.size];
memcpy(v, i.data, i.size * sizeof(int));
i.clear();