如何将矢量转换为数组

gan*_*uke 321 c++ arrays vector

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

Mic*_*zek 498

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

std::vector<double> v;
double* a = &v[0];
Run Code Online (Sandbox Code Playgroud)

  • @ganuke你没有复制,你正在制作一个指向矢量在内部使用的实际数组的指针.如果你想复制[GMan的回答](http://stackoverflow.com/questions/2923272/how-to-convert-vector-to-array-c/2923295#2923295)解释如何 (22认同)
  • `std :: vector <double> v; double*a = v.data();` (19认同)
  • @ganuke你没有,你只需要一个指向相同数据的`double*`.这个答案适用于这种情况 (6认同)
  • @guneykayim该向量拥有该内存,你不应该释放它 (6认同)
  • @ganuke:什么是"阵列"?您需要提供更多信息.大局是什么? (4认同)
  • @DenisV是的,只要它不是`bools`的矢量; 它们特别适合空间效率.它是规范中提到的第一个东西之一(23.2.4类模板`vector`):"向量的元素是连续存储的,这意味着如果`v`是`vector <T,Allocator>`其中`T `是除了`bool`之外的某种类型,然后它服从所有`0 <= n <v.size()`的身份`&v [n] ==&v [0] + n`." (3认同)
  • 由于此行不会复制数据,这是否意味着我在处理完后不需要删除a? (2认同)
  • @ThatPixelCherry 它不适用于 bool 因为 vector&lt;bool&gt; 是使用位图实现的。 (2认同)
  • vector.data()答案(http://stackoverflow.com/a/40031309/564626)更适合C++ 11 (2认同)
  • 回答时的“新规范”是? (2认同)
  • 如果 std::vector 或 std::array 为空,则使用 &amp;v[0] 是未定义行为,如果使用 c++0x 最好使用 v.data()。https://isocpp.org/wiki/faq/containers #vector-is-contiguous (2认同)

GMa*_*ckG 138

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

如果你正在调用一个期望前者的API函数,那么你可以做do_something(&v[0], v.size()),其中vdoubles 的向量.向量的元素是连续的.

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

double arr[100];
std::copy(v.begin(), v.end(), arr);
Run Code Online (Sandbox Code Playgroud)

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

  • 注意:使用v.size()获取新数组的元素数:double arr [v.size()]; (12认同)
  • @rbaleksandar:数组不能具有非常量表达式大小. (6认同)
  • @GManNickG我认为@Jet是说,如果你想将向量转换为数组,并且你打算使用`std:vector`的`size()`函数来调整数组的大小,你需要使用`new ` 或 `malloc` 来做到这一点。正如(您)已经指出的那样,“double arr[v.size()]”无效。使用向量代替 new 是一个好主意,但问题的重点是如何将向量转换为数组。 (4认同)
  • @rbaleksandar 没有误会;在 C++11 及更早版本中,数组大小必须是整型常量表达式。您的函数示例是 C 中 VLA 的常见用途,但仅受 C++ 中的(非标准)扩展支持。不过,它可能会出现在 C++14 上:http://stackoverflow.com/a/17318040/87234。但到目前为止,它根本不是一个标准选项。 (3认同)
  • 注意:使用“malloc”或“new”动态分配大小为v.size()的内存,然后将其全部复制到那里。请记住,当您不再需要该指针时,请“free()”或“删除”该指针。 (3认同)

小智 82

对于C++ 11,vector.data()将会有所作为.

  • 注意:它不复制向量的数据,它只存储指向向量内部使用的实际数组的指针。 (2认同)

use*_*715 17

vector<double> thevector;
//...
double *thearray = &thevector[0];
Run Code Online (Sandbox Code Playgroud)

这是保证通过该标准的工作,但也有一些注意事项:特别注意只使用thearray,而thevector在范围内.

  • ...并确保向量不是'empty()`,否则会调用可怕的UB. (4认同)
  • (未定义的行为) (2认同)

小智 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)

您不应该将向量转换为实际的数组实例.


Jay*_*llo 6

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

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

  2. int * arr = vec.data();

如果要将任何类型的T矢量转换为T* array,只需将以上内容替换intT

我将向您展示为什么上述两项有效,以取得很好的理解?

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++11data()成员函数只返回start_

pointer data()
{ 
     return start_; //(equivalent to `value_type*`, array head)
}
Run Code Online (Sandbox Code Playgroud)


Tob*_*oby 5

std::vector<double> vec;
double* arr = vec.data();
Run Code Online (Sandbox Code Playgroud)