我希望能够在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);
答案 0 :(得分:83)
您可以按如下方式获取指向第一个元素的指针:
int* pv = &v[0];
只要未重新分配向量,此指针才有效。如果您插入的元素多于适合向量的剩余容量(即v.size() + NumberOfNewElements > v.capacity()
,则会自动重新分配。您可以使用v.reserve(NewCapacity)
确保向量的容量至少为NewCapacity
还要记住,当向量被破坏时,底层数组也会被删除。
答案 1 :(得分:20)
int* pv = &v[0]
请注意,这仅适用于std::vector<>
,您不能对其他标准容器执行相同操作。
Scott Meyers在他的书中广泛地介绍了这个主题。
答案 2 :(得分:20)
在c ++ 11中,您可以使用vector::data()来获取C数组指针。
答案 3 :(得分:16)
如果您的条件非常有条理,您可以这样做:
std::vector<int> v(4,100);
int* pv = &v[0];
请注意,只有向量不必增长时,这才会起作用,向量仍将管理基础数组的生命周期(也就是说,不要删除pv)。这在调用底层C API时并不常见,但通常使用未命名的临时文件而不是通过创建显式的int *变量来完成。
答案 4 :(得分:0)
保护自己免受尺寸变化的一种方法是保留您需要的最大空间(或更大):
std::vector<int> v(4,100); //Maybe need
v.reserve(40); //reallocate to block out space for 40 elements
这将确保push_backs不会导致重新分配现有数据。