如何将std::vector<double>转换为double array[]?
std::vector<double>
double array[]
vector<double> thevector; //... double *thearray = &thevector[0];
这保证了标准的工作,但是有一些警告:特别注意,当thevector在作用域中时,只使用thearray。
thevector
thearray
这样做有一个相当简单的技巧,因为规范现在担保向量连续存储它们的元素:
std::vector<double> v; double* a = &v[0];
向量实际上是皮肤下的数组。如果你有一个函数:
void f( double a[]);
你可以这样调用它:
vector <double> v; v.push_back( 1.23 ) f( &v[0] );
你不应该需要将一个向量转换成一个实际的数组实例。
对什么?您需要澄清:您需要指向数组或数组的第一个元素的指针吗?
如果你正在调用一个期望前者的API函数,你可以执行do_something(&v[0], v.size()),其中v是doubles的向量。向量的元素是连续的。
do_something(&v[0], v.size())
v
double
否则,你只需要复制每个元素:
double arr[100]; std::copy(v.begin(), v.end(), arr);
不仅要确保arr足够大,还要确保arr被填充,或者你有未初始化的值。
arr
对于c++ 11, vector.data()就可以了。
vector.data()
如果你有一个函数,那么你可能需要这个:foo(&array[0], array.size());。如果你遇到了需要数组的情况,那么你需要重构,向量基本上是扩展数组,你应该总是使用它们。
foo(&array[0], array.size());
我们可以使用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; }
std::vector<double> vec; double* arr = vec.data();
你可以做一些这样的事情
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; } } }
对于std::vector<int> vec, vec获取int*,可以使用两种方法:
std::vector<int> vec
int*
Int * arr = &vec[0];
Int * arr = vvector .data();
如果你想将任意类型的T向量转换为T* array,只需将上面的int替换为T。
T
T* array
int
为了更好地理解,我将向你展示为什么上面两个是有效的?
std::vector本质上是一个动态数组。
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_)是vector分配的所有数组内存;
range (start_, end_of_storage_)
range(start_, finish_)是vector使用的所有数组内存;
range(start_, finish_)
range(finish_, end_of_storage_)是备份数组内存。
range(finish_, end_of_storage_)
比如向量vec。其中有{9,9,1,2,3,4}是指针,可以像下面这样。
因此&vec[0] = start_ (address.) (start_等价于int*数组头)
&vec[0]
在c++11中,data()成员函数只返回start_
c++11
data()
pointer data() { return start_; //(equivalent to `value_type*`, array head) }