如何将矢量转换为数组

时间:2010-05-27 17:14:40

标签: c++ arrays vector

如何将std::vector<double>转换为double array[]

10 个答案:

答案 0 :(得分:485)

有一个相当简单的技巧,因为现在规范guarantees向量连续存储它们的元素:

std::vector<double> v;
double* a = &v[0];

答案 1 :(得分:133)

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

如果您正在调用需要前者的API函数,则可以执行do_something(&v[0], v.size()),其中vdouble的向量。向量的元素是连续的。

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

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

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

答案 2 :(得分:66)

对于C++11vector.data()可以解决问题。

答案 3 :(得分:16)

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

这保证符合标准,但有一些注意事项:特别注意仅在thearray范围内使用thevector

答案 4 :(得分:13)

有效载体是皮肤下的数组。如果你有一个功能:

void f( double a[]);
你可以这样称呼它:

vector <double> v;
v.push_back( 1.23 )
f( &v[0] );

您不应该将矢量转换为实际的数组实例。

答案 5 :(得分:2)

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

  1. int * arr =&vec [0];

  2. 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}是指针,如下所示。

enter image description here

所以&vec[0] = start_(地址。)(start_等效于int *数组头)

c++11中,data()成员函数只返回start _

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

答案 6 :(得分:1)

如果你有一个功能,那么你可能需要这个:foo(&array[0], array.size());。如果你设法进入需要数组的情况,那么你需要重构,向量基本上是扩展数组,你应该总是使用它们。

答案 7 :(得分:1)

我们可以使用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;
}

答案 8 :(得分:1)

std::vector<double> vec;
double* arr = vec.data();

答案 9 :(得分:-1)

你可以做一些像这样的事情

<b>