做什么的?你需要澄清:你需要一个指向数组第一个元素的指针,还是一个数组?
如果您调用需要前者的 API 函数,则可以执行 do_something(&v[0], v.size())
,其中 v
是 double
的向量。向量的元素是连续的。
否则,您只需复制每个元素:
double arr[100];
std::copy(v.begin(), v.end(), arr);
确保不仅 arr
足够大,而且 arr
被填满,或者您有未初始化的值。
std:vector
的 size()
函数来调整数组的大小,则需要使用 new
或 {4 } 要做到这一点。正如(您)已经指出的那样,double arr[v.size()]
无效。使用 vector 代替 new 是一个好主意,但问题的重点是如何将向量转换为数组。
vector<double> thevector;
//...
double *thearray = &thevector[0];
这保证按标准工作,但有一些警告:特别注意仅在 thevector
范围内时使用 thearray
。
empty()
,否则这会调用可怕的 UB。
至于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} 的指针可能如下所示。
https://i.stack.imgur.com/yTkeA.png
所以 &vec[0]
= start_ (address.) (start_ 等价于 int* 数组头)
在 c++11
中的 data()
成员函数只返回 start_
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
向量实际上是皮肤下的数组。如果你有一个功能:
void f( double a[]);
你可以这样称呼它:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
您永远不需要将向量转换为实际的数组实例。
f( &v[0] );
std::vector<double> vec;
double* arr = vec.data();
我们可以使用 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;
}
如果您有一个函数,那么您可能需要这个: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;
}
}
}
不定期副业成功案例分享
double*
。这个答案适用于这种情况std::vector<double> v; double* a = v.data();