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