在C ++ std :: vector和C数组之间转换而不复制

我希望能够在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); 

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

 int* pv = &v[0]; 

只要向量不被重新分配,该指针就是有效的。 如果插入的元素多于适合向量的剩余容量(也就是说,如果v.size() + NumberOfNewElements > v.capacity() 。您可以使用v.reserve(NewCapacity)来确保向量具有至lessNewCapacity容量。

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

 int* pv = &v[0] 

注意这只是std::vector<> ,你不能对其他标准容器做同样的事情。

斯科特·迈耶斯(Scott Meyers)在他的着作中广泛地介绍了这个话题

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

如果你有非常可控的条件,你可以做:

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

要注意的是,只要向量不必增长,vector仍然可以pipe理底层数组的生命周期(也就是说,不要删除pv),这只会起作用。 调用底层C API时,这并不罕见,但通常使用未命名的临时文件而不是通过创build显式的int *variables来完成。

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

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

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