我可以将std :: vector <int> *转换为int *吗?

时间:2015-11-11 01:04:51

标签: c++ arrays vector pvm

假设我有一个std::vector<int>* foo;,我必须将它用作int*(int数组,而不是指向int的指针)用于旧的C类型库PVM。就我而言,这可能有用,因为vector将它的元素彼此相邻地存储在内存中,就像数组一样。所以我尝试了(int*)foo,但不知怎的,我得到了一个我无法调试的错误,所以我认为这一定是问题所在。任何想法,想法,优雅的解决方法?

2 个答案:

答案 0 :(得分:9)

您无法将矢量直接转换为数组,因为矢量对象包含指向数组数据的指针,而不是动态分配的数组数据本身。要访问基础数组,请使用data()成员函数:

std::vector<int> vec;

int *arr = vec.data();

或者

std::vector<int> *vecp = new std::vector<int>;

int *arr = vecp->data();

答案 1 :(得分:3)

是的,你可以。 @ApproachingDarknessFish应该prefer this answer使用C ++ 11中引入的std::vector::data

但是,如果您使用的是旧版C ++,则可以使用&foo[0]int*放到容器的开头。

请参阅this question了解std::vector::data优先于&foo.front()&foo[0]的原因(如果foo为空,则会产生未定义的行为!)

关于引用该标准的std::vector内存的连续布局,请查看此this answer

  

23.2.6类模板向量[向量]

     

1 vector是一个支持随机访问迭代器的序列容器。此外,它支持(摊销)最后的恒定时间插入和擦除操作;在中间插入和擦除需要线性时间。存储管理是自动处理的,但可以提供提示以提高效率。向量的元素是连续存储的,这意味着如果v是一个向量,其中T是除了bool之外的某种类型,那么它服从所有0&lt的同一性&amp; v [n] ==&amp; v [0] + n ; = n&lt; v.size()。