[英]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或多或少地充当数组。
但是,这有两个陷阱:
myArray
的生存期完全由v
包含时,上述内容才能正常工作。 如果向量超出范围,被清除或调整大小 ,则myArray
无效。 您仅指向v
的内部存储器,因此任何对该存储器进行更改的操作都会破坏myArray
。 v
没有大小。 在获取地址之前先给它一个尺寸。 如果要将向量的内容复制到数组,可以使用memcpy()
。
double* myArray = new double[v.size()];
memcpy( myArray, &v[0], v.size() * sizeof( double ) );
这将目前分配元件的数量在v
中myArray
和填充与包含在所述数据存储器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.