从另一个数组的指针和大小初始化数组

Posted

技术标签:

【中文标题】从另一个数组的指针和大小初始化数组【英文标题】:Initialize array from pointer and size of another array 【发布时间】:2021-04-22 13:31:10 【问题描述】:

在一个函数中,我可以访问另一个数组的指针和大小。将这些与指针一起传递,我想将该数据添加到地图中。如何在不复制基础数据两次的情况下做到这一点?

void addToMap(double* ptr, size_t size, unsigned key) 

 // Here I want to add the array corresponding to the pointer location and size to the map.
 // Since adding to the map needs to copy the data once anyway, I want to prevent any other copies.
 double array[size] = ?;

 // Can I initialize this array from the data found at (ptr) to (ptr + size) without a copy?
 array& = ptr; 

 _map[key] = array;


调用该函数后,所指向的数据将被删除。该映射只是从整数到双精度数组的映射。这只是意味着,我想以某种方式存储与此密钥关联的数据,而它仍然可用。

或者你有更好的想法吗?在这里使用std::vector<double> 会更慢吗?

【问题讨论】:

double array[size] 无论如何都不是标准的 C++。数组的大小必须是编译时常量。 有必要使用数组吗?不接受像double* array = ptr;这样的指针吗? 什么是_map,您将尝试通过传递数组来分配给_map[key]?你不能按照你的要求去做,但是根据_map是什么,可能还有其他解决方案。 array in _map[key] = array; 无论如何都会自动转换为指针。 std::vector<double> array(ptr, ptr + size);。这也意味着你的 map 需要有 std::vector<double> 作为值类型 【参考方案1】:

您不能像这样定义数组变量,因为函数参数可以在运行时变化,因此不是编译时间常数,这是对数组变量大小的要求。

您需要动态分配数组。 std::vector 是最简单的方法。

一个数组也不能直接从一个指向另一个数组的指针初始化,无论你是初始化一个数组变量(这里不是一个选项)还是一个动态数组。在这里,std::vector 也有助于它提供的构造函数。

那么我将如何在这里使用std::vector<double>

例子:

std::unordered_map<unsigned, std::vector<double>> _map;

// addToMap
_map.emplace(key, std::vector<double>ptr, ptr + size);

我建议使用std::span&lt;double&gt; 作为参数而不是指针和大小。

【讨论】:

那么我将如何在这里使用std::vector&lt;double&gt; 谢谢!似乎正在工作。而且这只复制一次数据? @EigenGrau 是的。 I recommend using std::span&lt;double&gt; as the argument instead of the pointer and size. 为什么? @EigenGrau 使用起来更简单。这样你就可以调用:addToMap(some_array, key) 而不是addToMap(some_array, std::size(some_array), key)。另一种选择是按值接受模板化范围,如果调用者传递右值std::vector&lt;double&gt;,这将允许完全避免复制。

以上是关于从另一个数组的指针和大小初始化数组的主要内容,如果未能解决你的问题,请参考以下文章

数组和指针

在 C 中初始化指针数组 - 可变大小的对象可能未初始化

没有初始大小的字符串数组给出空指针异常

C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

C# - 我可以使用数组初始化器从另一个字节数组中构建一个字节数组吗?

c++初始化vector数组?