如何将向量转换为数组并访问它

时间:2014-01-20 16:11:57

标签: c++ arrays pointers vector

我需要将std :: vector转换为数组。我尝试使用这个简单的代码:

#include <vector>
#include <iostream>

using namespace std;

int main(){

vector<double> v;
double* a = &v[0];


for (int i=0; i<10; i++)
v.push_back(i);

cout<<"Value -V- 9: "<<v[9]<<endl;
cout<<"Value -a- 9: "<<a[9]<<endl; //Gives me segmentation fault error

return 0;
}

我在另一个讨论中读到了将矢量转换为数组的方法,但现在我还需要访问我的数组中的单个元素(这样编译器就会给出分段错误的错误)。我是c +中的新手,也许这种方法完全错了。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

首先,您应该了解std :: vector的工作原理:它是一个自扩展数组,可以在需要时重新分配其内部存储。 获取指向内部数组的指针的正确方法是调用std :: vector :: data成员(仅在C ++ 11中可用):

double * a = v.data();

请注意,此指针仅在修改向量之前有效。 为了以防万一,这里的“转换”并不意味着真正的转换,矢量不会被修改,也不会创建新的数组。只接收指向存储在std :: vector中的数据的指针。

答案 1 :(得分:0)

double* a = &v[0];

答案已经在评论中发布了,但最重要的是你正在初始化一个无效的地址,因为在程序中的那一点,向量没有数据。为了使您的示例有效,您需要在循环完成后设置指针a。矢量可能在插入期间重新分配,因此在插入后您无法信任原始指针。在这种情况下,从未指出任何有效的东西。

通常,获取元素地址的能力与需要原始指针的旧接口结合使用。如果您正在编写新的C ++代码,最好使用容器的接口来获取数据。首选迭代器而不是原始指针,并了解迭代器如何通过某些操作失效。