ChatGPT解决这个技术问题 Extra ChatGPT

如何将向量转换为数组

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

有点想问为什么?您可以将向量作为数组访问。数组有什么作用而向量没有?
@Michael我的典型用例是在我自己的代码中使用向量,并且需要调用带有数组的第三方函数
被抛出的术语令人困惑。指针不是数组。我们想要一个指向数组第一个元素的指针,还是一个数组?
@MichaelDorgan 难以置信,有时是必要的。例如,当作为参数传递给 CUDA 内核时
当您必须先构建 argc/argv 数组并过滤某些选项时,此功能对于指向 char* 的向量特别有用。

M
Michael Mrozek

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

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

@ganuke您不是在复制,而是在创建一个指向向量在内部使用的实际数组的指针。如果您想复制 GMan's answer 说明如何
@ganuke:什么是“数组”?您需要提供更多信息。大局是什么?
@ganuke你不需要,你只需要一个指向相同数据的 double* 。这个答案适用于这种情况
@guneykayim 向量拥有该内存,您不应该释放它
std::vector<double> v; double* a = v.data();
G
GManNickG

做什么的?你需要澄清:你需要一个指向数组第一个元素的指针,还是一个数组?

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

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

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

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


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

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


注意:它不复制向量的数据,它只存储指向向量内部使用的实际数组的指针。
F
Federico klez Culloca
vector<double> thevector;
//...
double *thearray = &thevector[0];

这保证按标准工作,但有一些警告:特别注意仅在 thevector 范围内时使用 thearray


...并确保向量不是 empty(),否则这会调用可怕的 UB。
(未定义的行为)
J
Jayhello

至于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] );
T
Toby
std::vector<double> vec;
double* arr = vec.data();

r
rashedcs

我们可以使用 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());。如果您设法遇到需要数组的情况,那么您需要重构,向量基本上是扩展数组,您应该始终使用它们。


S
Sakthi Vignesh

你可以做一些这样的事情

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

v[i][j];对于二维数组