假设我有一个std::vector<int>* foo;
,并且我必须将它用作int*
旧 C 类型库 PVM 的(int 数组,而不是指向 int 的指针)。就我而言,这可能会起作用,因为vector
它的元素在内存中彼此相邻,就像数组一样。所以我尝试(int*)foo
了,但不知何故我得到了一个我无法调试的错误,所以我认为这一定是问题所在。有什么想法、想法、优雅的解决方法吗?
问问题
6503 次
2 回答
10
您不能将向量直接转换为数组,因为向量对象由指向数组数据的指针组成,而不是由动态分配的数组数据本身组成。要访问底层数组,请使用data()
成员函数:
std::vector<int> vec;
int *arr = vec.data();
或者
std::vector<int> *vecp = new std::vector<int>;
int *arr = vecp->data();
于 2015-11-11T01:06:27.330 回答
4
是的你可以。您应该更喜欢@ApproachingDarknessFish 的这个答案std::vector::data
,因为它是在 C++11 中引入的。
但是,如果您使用的是旧版本的 C++,您可以使用&foo[0]
它来int*
启动容器。
请参阅此问题,了解为什么std::vector::data
优先于&foo.front()
and (如果为空,&foo[0]
两者都会产生未定义的行为!)foo
看看这个关于引用标准的内存连续布局的答案:std::vector
23.2.6 类模板向量【向量】
1 向量是支持随机访问迭代器的序列容器。此外,它还支持(摊销)恒定时间的最后插入和擦除操作;在中间插入和擦除需要线性时间。存储管理是自动处理的,但可以给出提示以提高效率。向量的元素是连续存储的,这意味着如果 v 是一个向量,其中 T 是除 bool 之外的某种类型,那么对于所有 0 <= n < v,它都遵循恒等式 &v[n] == &v[0] + n 。尺寸()。
于 2015-11-11T01:06:12.440 回答