在 C++ std::vector 和 C 数组之间进行转换,无需复制

问题描述 投票:0回答:5

我希望能够在 std::vector 及其底层 C 数组 int* 之间进行转换,而无需显式复制数据。

std::vector 是否提供对底层 C 数组的访问?我正在寻找这样的东西

vector<int> v (4,100)
int* pv = v.c_array();

编辑:

另外,是否可以进行相反的操作,即如何在不复制的情况下从 C 数组初始化

std::vector

int pv[4] = { 4, 4, 4, 4};
vector<int> v (pv);
c++ c arrays stl stdvector
5个回答
94
投票

您可以按如下方式获取指向第一个元素的指针:

int* pv = &v[0];

该指针仅在向量未被重新分配时才有效。如果您插入的元素多于向量剩余容量(即,如果

v.size() + NumberOfNewElements > v.capacity()
),则会自动进行重新分配。您可以使用
v.reserve(NewCapacity)
来确保向量的容量至少为
NewCapacity

还要记住,当向量被销毁时,底层数组也会被删除。


36
投票

在c++11中,你可以使用vector::data()来获取C数组指针。


21
投票
int* pv = &(v[0]);

请注意,这仅适用于

std::vector<>
,您不能对其他标准容器执行相同的操作(
std::string
除外)。

斯科特·迈耶斯(Scott Meyers)在他的书中广泛讨论了这个主题。


17
投票

如果您的条件非常受控,您可以这样做:

std::vector<int> v(4,100);
int* pv = &v[0];

请注意,只有在向量不必增长的情况下,这才有效,并且向量仍将管理底层数组的生命周期(也就是说,不要删除 pv)。在调用底层 C API 时,这并不是一件罕见的事情,但它通常是使用未命名的临时变量来完成的,而不是通过创建显式的 int* 变量来完成。


0
投票

保护自己免受尺寸变化影响的一种方法是保留您需要的最大空间(或更大):

std::vector<int> v(4,100); //Maybe need 
v.reserve(40);             //reallocate to block out space for 40 elements

这将确保push_backs不会导致现有数据的重新分配。

© www.soinside.com 2019 - 2024. All rights reserved.