C++ 如何使用std::copy()复制到指向字节通用缓冲区开头的目标?

C++ 如何使用std::copy()复制到指向字节通用缓冲区开头的目标?,c++,vector,std,C++,Vector,Std,在本例中,假设myVector是某种自定义类型的std::vectormyType unsigned char* bufferPtr = myBufferOfBytes.getBufferPointer(); std::copy(myVector.begin(), myVector.end(), bufferPtr); 这是否可能以某种方式实现,或者我只能使用std::memcpy()来实现这一点?您可以使用未初始化的\u copy并将缓冲ptr强制转换为预期类型: std::uninitia

在本例中,假设myVector是某种自定义类型的std::vector
myType

unsigned char* bufferPtr = myBufferOfBytes.getBufferPointer();
std::copy(myVector.begin(), myVector.end(), bufferPtr);

这是否可能以某种方式实现,或者我只能使用
std::memcpy()
来实现这一点?

您可以使用
未初始化的\u copy
并将
缓冲ptr
强制转换为预期类型:

std::uninitialized_copy(myVector.begin(), myVector.end(), reinterpret_cast<myType*>(bufferPtr));
std::未初始化的拷贝(myVector.begin()、myVector.end()、重新解释转换(bufferPtr));
通常的警告适用于:

  • 确保
    bufferPtr
    的长度足以容纳整个副本
  • bufferPtr
    最初必须分配为
    unsigned char
    的数组,否则您可能会调用未定义的行为(如果数组最初分配为
    myType
    ,则使用
    std::copy
  • bufferPtr
    的对齐必须大于或等于
    alignof(myType)
  • 如果
    myType
    不是可破坏的,那么
    bufferPtr
    必须以知道的方式释放

您可以使用
未初始化的\u copy
并将
缓冲ptr
强制转换为预期类型:

std::uninitialized_copy(myVector.begin(), myVector.end(), reinterpret_cast<myType*>(bufferPtr));
std::未初始化的拷贝(myVector.begin()、myVector.end()、重新解释转换(bufferPtr));
通常的警告适用于:

  • 确保
    bufferPtr
    的长度足以容纳整个副本
  • bufferPtr
    最初必须分配为
    unsigned char
    的数组,否则您可能会调用未定义的行为(如果数组最初分配为
    myType
    ,则使用
    std::copy
  • bufferPtr
    的对齐必须大于或等于
    alignof(myType)
  • 如果
    myType
    不是可破坏的,那么
    bufferPtr
    必须以知道的方式释放

我敢肯定,为了简洁起见,您已经忽略了它,但对其他人来说,当您准备写入这样的缓冲区时,不要忘记检查您的设置!检查你的什么?你的评论中有一个输入错误。哦,检查你的边界。我确信你为了简洁起见忽略了它,但是对其他人来说,当你准备写入这样的缓冲区时,不要忘记检查你的边界!检查你的什么?您的评论中有一个输入错误。哎呀,请检查您的边界。并确保缓冲区正确对齐,可以用作
myType
@JerryCoffin,谢谢提醒。我现在正在扩展警告列表。或者,将
myVector
视为无符号字符,并复制它们。根据缓冲区中当前的内容,您可能首先需要一些位置消息,即使对于
myType=int
。至少在形式上是这样@zneak:是的——但大多数这样的代码都依赖于此(例如,通过网络复制数据并在另一端恢复有意义的内容)。请确保缓冲区正确对齐,以用作
myType
@JerryCoffin,谢谢提醒。我现在正在扩展警告列表。或者,将
myVector
视为无符号字符,并复制它们。根据缓冲区中当前的内容,您可能首先需要一些位置消息,即使对于
myType=int
。至少在形式上是这样@zneak:是的,但大多数这样的代码都依赖于此(例如,通过网络复制数据并在另一端恢复有意义的内容)。