从另一个数组的指针和大小初始化数组
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<double>
作为参数而不是指针和大小。
【讨论】:
那么我将如何在这里使用std::vector<double>
?
谢谢!似乎正在工作。而且这只复制一次数据?
@EigenGrau 是的。
I recommend using std::span<double> as the argument instead of the pointer and size.
为什么?
@EigenGrau 使用起来更简单。这样你就可以调用:addToMap(some_array, key)
而不是addToMap(some_array, std::size(some_array), key)
。另一种选择是按值接受模板化范围,如果调用者传递右值std::vector<double>
,这将允许完全避免复制。以上是关于从另一个数组的指针和大小初始化数组的主要内容,如果未能解决你的问题,请参考以下文章
C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )