如何将std::vector<double>
转换为double array[]
?
答案 0 :(得分:485)
有一个相当简单的技巧,因为现在规范guarantees向量连续存储它们的元素:
std::vector<double> v;
double* a = &v[0];
答案 1 :(得分:133)
为什么?您需要澄清:您是否需要指向数组的第一个元素或数组的指针?
如果您正在调用需要前者的API函数,则可以执行do_something(&v[0], v.size())
,其中v
是double
的向量。向量的元素是连续的。
否则,您只需要复制每个元素:
double arr[100];
std::copy(v.begin(), v.end(), arr);
确保arr
不仅足够大,而且arr
已填满,或者您有未初始化的值。
答案 2 :(得分:66)
对于C++11,vector.data()
可以解决问题。
答案 3 :(得分:16)
vector<double> thevector;
//...
double *thearray = &thevector[0];
这保证符合标准,但有一些注意事项:特别注意仅在thearray
范围内使用thevector
。
答案 4 :(得分:13)
有效载体是皮肤下的数组。如果你有一个功能:
void f( double a[]);
你可以这样称呼它:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
您不应该将矢量转换为实际的数组实例。
答案 5 :(得分:2)
对于std::vector<int> vec
,通过vec获取int*
,您可以使用两种方法:
int * arr =&vec [0];
int * arr = vec.data();
如果要将任何类型的 T
向量转换为T* array
,只需将上面的int
替换为T
。
为使您更好地理解,我将向您展示以上两种方法为何起作用?
std::vector
本质上是一个动态数组。
主要数据成员如下:
template <class T, class Alloc = allocator<T>>
class vector{
public:
typedef T value_type;
typedef T* iterator;
typedef T* pointer;
//.......
private:
pointer start_;
pointer finish_;
pointer end_of_storage_;
public:
vector():start_(0), finish_(0), end_of_storage_(0){}
//......
}
range (start_, end_of_storage_)
是向量分配的所有数组内存;
range(start_, finish_)
是向量使用的所有数组内存;
range(finish_, end_of_storage_)
是备份阵列内存。
例如,关于向量vec。其中{9、9、1、2、3、4}是指针,如下所示。
所以&vec[0]
= start_(地址。)(start_等效于int *数组头)
在c++11
中,data()
成员函数只返回start _
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
答案 6 :(得分:1)
如果你有一个功能,那么你可能需要这个:foo(&array[0], array.size());
。如果你设法进入需要数组的情况,那么你需要重构,向量基本上是扩展数组,你应该总是使用它们。
答案 7 :(得分:1)
我们可以使用data()方法完成此操作。 C ++ 11提供了这种方法。
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
vector<int>v = {7, 8, 9, 10, 11};
int *arr = v.data();
for(int i=0; i<v.size(); i++)
{
cout<<arr[i]<<" ";
}
return 0;
}
答案 8 :(得分:1)
std::vector<double> vec;
double* arr = vec.data();
答案 9 :(得分:-1)
你可以做一些像这样的事情
<b>