62

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

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

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

编辑:

另外,是否可以反过来,即如何在std::vector不复制的情况下从 C 数组初始化一个?

int pv[4] = { 4, 4, 4, 4};
vector<int> v (pv);
4

5 回答 5

91

您可以获得指向第一个元素的指针,如下所示:

int* pv = &v[0];

这个指针只有在向量没有被重新分配时才有效。如果您插入的元素多于向量的剩余容量(也就是说,如果v.size() + NumberOfNewElements > v.capacity(). 您可以使用它v.reserve(NewCapacity)来确保向量的容量至少为NewCapacity.

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

于 2009-11-14T03:38:23.680 回答
31

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

于 2014-05-31T08:59:35.490 回答
20
int* pv = &v[0]

请注意,这仅适用于std::vector<>,您不能对其他标准容器执行相同操作。

Scott Meyers 在他的书中广泛讨论了这个主题。

于 2009-11-14T03:36:01.543 回答
17

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

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

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

于 2009-11-14T03:37:36.003 回答
0

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

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

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

于 2012-05-17T21:52:55.927 回答