在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不会导致现有数据的重新分配。