繁体   English   中英

如何使用指向第一个元素的指针分配C ++数组?

[英]How to assign C++ array with a pointer to first element?

很抱歉,我对C ++还是很陌生,因此感谢您的耐心配合。

作为项目中不可更改约束的一部分,我必须将Vector转换为Array。 在我寻找一个解决方案,我曾多次遇到类似的回答这一个

据我了解,该解决方案为您提供了指向向量中第一个元素的指针-并且由于保证向量在内存中是连续的,因此您可以将数组设置为指向该内存位置(或类似位置)。

我的问题是,但是, 我到底该如何在C ++中做到这一点? 答案似乎表明它是微不足道的,但我找不到如何做到的。

我已经尝试过这种性质的东西,但是它们不起作用。

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

给定一个指向序列中第一个元素的指针,然后如何使用该指针“填充”数组? 此外,我是否需要担心大小差异/越界问题? 另外,我是否也可以反向执行此操作(用指向数组第一个元素的指针“填充”向量)?

您不能使用指向向量的第一个元素的指针将元素插入向量。 向量具有唯一的内容,因此必须仅允许使用其自己的接口更改其大小,否则它无法跟踪其拥有的元素数。

你可以这样做:

std::vector<double> v(N); // N elements initialized to 0.0
double* a = v.data();
do_something(a, N); // tell the function to write N elements

例如,如果您有一个向量和一个数组

std::vector<double> v;
double myArray[100];

并希望数组包含向量的元素,您应该在数组中复制向量的元素,例如

std::copy( v.begin(), 
           std::next( v.begin(), std::min<std::vector<double>::size_type>( v.size(), 100 ) ),
           std::begin( myArray ) );

要么

std::copy( v.begin(), 
           v.begin() + std::min<std::vector<double>::size_type>( v.size(), 100 ),
           myArray );

如果您希望向量具有数组的元素,则可以编写

v.assign( std::begin( myArray ), std::end( myArray ) );

要么

v.insert( v.end(), std::begin( myArray ), std::end( myArray ) );

或者,您可以声明向量并同时对其进行初始化(在定义和填充数组之后)

std::vector<double> v( std::begin( myArray ), std::end( myArray ) );

那和

std::vector<double> v( myArray, myArray + 100 );

这取决于数组和向量的生存期,以及如何计划使用数组。

如果只想将向量作为数组访问,则可以像编写以下代码一样简单地进行操作:

double* myArray = &v[0];

或者,使用C ++ 11或更高版本:

double* myArray = v.data();

然后,您可以使用myArray来访问向量,就好像它是一个数组一样。 实际上,这只是将向量的内部存储器别名为单独的指针。 下标运算符[]处理指针,因此使myArray或多或少地充当数组。

但是,这有两个陷阱:

  1. myArray的生存期完全由v包含时,上述内容才能正常工作。 如果向量超出范围,被清除或调整大小 ,则myArray无效。 您仅指向v的内部存储器,因此任何对该存储器进行更改的操作都会破坏myArray
  2. 如您的示例中所述,此操作一开始就无效,因为向量v没有大小。 在获取地址之前先给它一个尺寸。

如果要将向量的内容复制到数组,可以使用memcpy()

double* myArray = new double[v.size()];
memcpy( myArray, &v[0], v.size() * sizeof( double ) );

这将目前分配元件的数量在vmyArray和填充与包含在所述数据存储器v 但是,对myArray任何更改都将独立于v 您只需将向量复制到数组中。

还有其他几种方法可以完成第二个选择。

可以进行数组引用:

vector<double> v(100);   // must size the vector first, or at least add 1 element and call reserve(100)
double (&myArray)[100] = reinterpret_cast<double(&)[100]>(v[0]);

然后,您可以使用myArray[0]myArray[1]等。但是,如果将其插入向量中,则myArray将变为无效(并且无法“移动”它)。

尽管这是可能的,但这将是非常不寻常的,因此您不应该在任何实际代码中都这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM