首页 文章

在不复制的情况下在C std :: vector和C数组之间进行转换

提问于
浏览
49

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

5 回答

  • 0

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

    int* pv = &v[0];
    

    只要未重新分配向量,此指针才有效 . 如果插入的元素多于向量的剩余容量(即 v.size() + NumberOfNewElements > v.capacity() ,则可以使用 v.reserve(NewCapacity) 以确保向量的容量至少为 NewCapacity ),则会自动重新分配 .

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

  • 80
    int* pv = &v[0]
    

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

    Scott Meyers在他的书中广泛地介绍了这个主题 .

  • 15

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

  • 19

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

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

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

  • 19

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

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

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

相关问题