我如何转换一个std::vector<双>到双数组[]?


当前回答

对于std::vector<int> vec, vec获取int*,可以使用两种方法:

Int * arr = &vec[0]; Int * arr = vvector .data();

如果你想将任何类型的T向量转换为T*数组,只需将上面的int替换为T。

为了更好地理解,我将向你展示为什么上面两个是有效的?

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_, finish_)是vector使用的所有数组内存;

范围(finish_, end_of_storage_)是备份阵列内存。

比如向量vec。其中有{9,9,1,2,3,4}是指针,可以像下面这样。

因此,&vec[0] = start_ (address.) (start_等价于int*数组头)

在c++11中,data()成员函数只返回start_

pointer data()
{ 
     return start_; //(equivalent to `value_type*`, array head)
}

其他回答

vector<double> thevector;
//...
double *thearray = &thevector[0];

这是保证工作的标准,但有一些警告:特别是要注意,只使用数组,而vector是在范围内。

你可以做一些这样的事情

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;
        }
    }
}

对什么?您需要澄清:您需要指向数组或数组的第一个元素的指针吗?

如果你正在调用一个期望前者的API函数,你可以执行do_something(&v[0], v.size()),其中v是一个双精度向量。向量的元素是连续的。

否则,你只需要复制每个元素:

double arr[100];
std::copy(v.begin(), v.end(), arr);

确保不仅arr足够大,而且arr被填满,或者你有未初始化的值。

对于c++ 11, vector.data()就可以了。

对于std::vector<int> vec, vec获取int*,可以使用两种方法:

Int * arr = &vec[0]; Int * arr = vvector .data();

如果你想将任何类型的T向量转换为T*数组,只需将上面的int替换为T。

为了更好地理解,我将向你展示为什么上面两个是有效的?

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_, finish_)是vector使用的所有数组内存;

范围(finish_, end_of_storage_)是备份阵列内存。

比如向量vec。其中有{9,9,1,2,3,4}是指针,可以像下面这样。

因此,&vec[0] = start_ (address.) (start_等价于int*数组头)

在c++11中,data()成员函数只返回start_

pointer data()
{ 
     return start_; //(equivalent to `value_type*`, array head)
}