如何将a转换std::vector<double>
为a double array[]
?
如何将a转换std::vector<double>
为a double array[]
?
Answers:
有一个相当简单的技巧,因为此规范现在保证向量可以连续存储其元素:
std::vector<double> v;
double* a = &v[0];
double*
指向相同数据的a即可。这个答案适用于正是这种情况下
std::vector<double> v; double* a = v.data();
做什么的?您需要澄清:您是否需要指向数组第一个元素或数组的指针?
如果要调用期望使用前者的API函数,则可以执行do_something(&v[0], v.size())
,其中v
是的向量double
。向量的元素是连续的。
否则,您只需要复制每个元素:
double arr[100];
std::copy(v.begin(), v.end(), arr);
确保不仅thar arr
足够大,而且已经arr
装满,或者您具有未初始化的值。
size()
功能来调整数组的大小,则std:vector
需要使用new
或malloc
这样做。正如您已经指出的那样,这double arr[v.size()]
是无效的。使用vector代替new是一个好主意,但是问题的关键是如何将vector转换为数组。
向量实际上是皮肤下的数组。如果具有功能:
void f( double a[]);
您可以这样称呼它:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
您永远不需要将向量转换为实际的数组实例。
f( &v[0] );
是最后一行
对于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,2,3,4}是指针的对象可能如下所示。
所以&vec[0]
= start_(address。)(start_等效于int *数组头)
在c++11
该data()
成员函数只返回start_
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
如果你有一个功能,那么你可能需要这样的:foo(&array[0], array.size());
。如果遇到需要数组然后需要重构的情况,向量基本上是扩展数组,则应始终使用它们。
你可以这样做
vector <int> id;
vector <double> v;
if(id.size() > 0)
{
for(int i = 0; i < id.size(); i++)
{
for(int j = 0; j < id.size(); j++)
{
double x = v[i][j];
cout << x << endl;
}
}
}