用于将数组转换为矢量的内存
Memcpy for converting array to vector
我有一个函数,我想用它来将双精度数组转换为双精度向量:
std::vector<double> ArrayToVector(const double* arr, int length)
{
std::vector<double> vec(length);
memcpy(&vec[0], &arr[0], length);
return vec;
};
但是当我运行时:
int main()
{
double* x = new double[3];
x[0] = 2;
x[1] = 4;
x[2] = 6;
std::vector<double> y = ArrayToVector(x, 3);
for (int i = 0; i < 3; i++)
{
std::cout << y[i] << " ";
}
return 0;
}
我得到输出:
0 0 0
而不是
2 4 6
为什么?
你的问题是memcpy期望一个以字节为单位的大小,而不是元素的数量,所以你需要将第三个参数乘以sizeof(double)
但实际上你应该做的是使用向量的构造函数,它需要两个迭代器,如下所示:
std::vector<double> y(x, x + 3);
这样你甚至不需要担心大小,而且它更短!
或者,您可以使用std::copy
(如我的评论/另一个答案中所述,但无缘无故地更长)
不要使用memcpy
复制到std::vector
中,效率较低且容易出错。
它的效率较低,因为当您构造或调整向量大小时,它会使用值初始化的元素填充新元素(除非您提供一个元素),算术类型为 0。但是该初始化是不必要的,因为随后会覆盖这些值。这种初始化可能很便宜,但它不是免费的。
std::vector
有一个构造函数,它接受两个迭代器,正如其他人已经提到的,它们复制输入范围。此构造函数避免了复制前不必要的默认初始化。
std::vector
还具有assign
和insert
成员函数,这些函数采用两个迭代器并有效地复制输入范围。v.append(beg, end)
v.insert(v.end(), beg, end)
.
在我看来,在C++代码中使用memset
、memcpy
和memmov
总是一个错误。
这些函数由标准 C 库实现,因此会丢失输入参数类型/对齐信息(因为它们需要void*
)。在切换到最合适的 SIMD 版本之前,他们需要在运行时检查参数的对齐方式和大小。未对齐的开头和结尾由非 SIMD 指令处理。
而C++编译器知道类型的对齐方式和大小,并内联生成适当的 SIMD 指令,而无需像 C 库函数那样进行对齐和大小检查。同样,这些支票可能很便宜,但它们不是免费的。
C++算法,如std::copy
、std::copy_backward
、std::fill
和容器复制函数,需要两个迭代器,这些C原语函数会自动用于POD类型。
C++初始值设定项表达式(如{}
indouble buf[N] = {};
)为您memset
,但同样,以更高效且更不容易出错的方式。
您需要使用:
memcpy(&vec[0], &arr[0], length*sizeof(double));
或者更好的是,使用:
int main()
{
double* x = new double[3];
x[0] = 2;
x[1] = 4;
x[2] = 6;
std::vector<double> y(x, x+3);
for (int i = 0; i < 3; i++)
{
std::cout << y[i] << " ";
}
return 0;
}
memcpy 复制字节。因此,您必须指定要复制的字节数(而不是双精度数)。
memcpy(&vec[0], &arr[0], length * sizeof( double ) );
然而,这种方法是不好的。最好按以下方式定义向量
std::vector<double> ArrayToVector(const double* arr, int length)
{
return { arr, arr + length };
}
或
std::vector<double> ArrayToVector(const double* arr, int length)
{
std::vector<double> vec( arr, arr + length );
return vec;
}
考虑到您需要为阵列释放分配的内存。例如,您可以对分配的数组使用智能指针std::unique_ptr
。
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 使用无符号字符数组有效存储内存
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 为什么调用堆栈数组会导致内存泄漏
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 查找自动生成键并具有线性内存消耗的小型关联数组
- C++,为什么数组比矢量更快,使用更少的内存
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 当另一个数组是内存集时,内存集是否会更改数组长度?
- 动态分配字符数组的内存
- 将内存分配返回值强制转换为 TYPE 数组
- 销毁C++中动态分配的内存(数组对象)
- 给定特定内存地址的数组的动态内存分配
- 如何通过 malloc 为队列数组分配内存?
- 如何使用内存集清除字符数组
- 如何初始化所有元素为 0 的指针的二维动态内存数组
- 共享内存数组是否由 CreateFileMapping/MapViewOfFile 零初始化
- C++ 分配 struc 的内存数组
- 在CUDA中有效初始化共享内存数组