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

dzh*_*lil 54 c c++ arrays stl stdvector

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

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

vector<int> v (4,100)
int* pv = v.c_array();
Run Code Online (Sandbox Code Playgroud)

编辑:

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

int pv[4] = { 4, 4, 4, 4};
vector<int> v (pv);
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 85

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

int* pv = &v[0];
Run Code Online (Sandbox Code Playgroud)

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

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

  • "只要你不向矢量添加额外的元素" - 不首先保留空间.如果你保留()`,那么你可以添加最多保留容量的元素,并保证引用和迭代器仍然有效. (7认同)
  • 反过来是不可能的; STL容器管理自己的内存.您无法创建向量并让它管理您在其他位置分配的某个数组.将数组_copy_转换为向量的最简单方法是使用`std :: vector <int> v(&pv [0],&pv [4]);`,使用您添加到问题中的示例. (6认同)
  • 我认为 vector 没有消耗构造函数来让它拥有现有数组的所有权,这实在太糟糕了。使与 C 库的互操作更加困难。 (3认同)
  • @Steve:好点.请确保在获得指针之前保留()!:) (2认同)

m.e*_*ahi 21

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


Ðаn*_*Ðаn 20

int* pv = &v[0]
Run Code Online (Sandbox Code Playgroud)

请注意,这只是情况std::vector<>,您不能对其他标准容器执行相同操作.

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

  • 你可以使用`c_str()`或`data()`成员获得一个包含`std :: string`元素的只读数组.因此,虽然标准不要求字符串在内存中连续存储,但如果不这样做则会非常奇怪和低效. (3认同)
  • 我相信这甚至可以保证符合标准. (2认同)

Dre*_*all 16

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

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

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