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.
还要记住,当向量被破坏时,底层数组也会被删除.
Ðаn*_*Ðаn 20
int* pv = &v[0]
Run Code Online (Sandbox Code Playgroud)
请注意,这只是情况std::vector<>,您不能对其他标准容器执行相同操作.
Scott Meyers在他的书中广泛地介绍了这个主题.
Dre*_*all 16
如果您有非常可控的条件,您可以这样做:
std::vector<int> v(4,100);
int* pv = &v[0];
Run Code Online (Sandbox Code Playgroud)
请注意,只有向量不必增长时,这才会起作用,并且向量仍将管理基础数组的生命周期(也就是说,不要删除pv).在调用底层C API时,这不是一件罕见的事情,但它通常使用未命名的临时文件而不是通过创建显式的int*变量来完成.