Mic*_*zek 498
有一个相当简单的技巧,因为规范现在保证向量连续存储它们的元素:
std::vector<double> v;
double* a = &v[0];
Run Code Online (Sandbox Code Playgroud)
GMa*_*ckG 138
做什么的?您需要澄清:您是否需要指向数组的第一个元素或数组的指针?
如果你正在调用一个期望前者的API函数,那么你可以做do_something(&v[0], v.size()),其中v是doubles 的向量.向量的元素是连续的.
否则,您只需复制每个元素:
double arr[100];
std::copy(v.begin(), v.end(), arr);
Run Code Online (Sandbox Code Playgroud)
确保不仅thar arr足够大,而且arr填满了,或者你有未初始化的值.
use*_*715 17
vector<double> thevector;
//...
double *thearray = &thevector[0];
Run Code Online (Sandbox Code Playgroud)
这是保证通过该标准的工作,但也有一些注意事项:特别注意只使用thearray,而thevector在范围内.
小智 13
矢量有效地是皮肤下的阵列.如果你有一个功能:
void f( double a[]);
Run Code Online (Sandbox Code Playgroud)
你可以这样称呼它:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
Run Code Online (Sandbox Code Playgroud)
您不应该将向量转换为实际的数组实例.
对于std::vector<int> vecvec 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){}
//......
}
Run Code Online (Sandbox Code Playgroud)
的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)
}
Run Code Online (Sandbox Code Playgroud)