2

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

4

2 回答 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 回答