我需要将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 +中的新手,也许这种方法完全错了。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:2)
首先,您应该了解std :: vector的工作原理:它是一个自扩展数组,可以在需要时重新分配其内部存储。 获取指向内部数组的指针的正确方法是调用std :: vector :: data成员(仅在C ++ 11中可用):
double * a = v.data();
请注意,此指针仅在修改向量之前有效。 为了以防万一,这里的“转换”并不意味着真正的转换,矢量不会被修改,也不会创建新的数组。只接收指向存储在std :: vector中的数据的指针。
答案 1 :(得分:0)
double* a = &v[0];
答案已经在评论中发布了,但最重要的是你正在初始化一个无效的地址,因为在程序中的那一点,向量没有数据。为了使您的示例有效,您需要在循环完成后设置指针a。矢量可能在插入期间重新分配,因此在插入后您无法信任原始指针。在这种情况下,从未指出任何有效的东西。
通常,获取元素地址的能力与需要原始指针的旧接口结合使用。如果您正在编写新的C ++代码,最好使用容器的接口来获取数据。首选迭代器而不是原始指针,并了解迭代器如何通过某些操作失效。