如何将 std::矢量<vector>转换为 void*

how to convert std::vector<vector> to void*

本文关键字:gt void 转换 vector lt std 矢量      更新时间:2023-10-16

我想知道如何将std::vector<vector>转换为void*,例如:

std::vector<ColorData> pixels_ (w*h, background_color);

现在我想把pixels_转换成void*,这样我就可以把memcpy转换成pixels_

memcpy ((void*)destinationBuffer->pixels_, (void*)sourceBuffer->pixels_, 
sizeof(ColorData)*destinationBuffer->width_*destinationBuffer->height_);
 

但是当我运行这段代码时,我得到一个错误:

从类型' std::vector '转换为类型' void* '无效

如何将std::vector<vector>转换为void* ?

要将矢量转换为void*类型,有两个选项:

  • c++ 11预版本:(void*)&pixels_[0](建议使用!empty()检查)
  • c++ 11: static_cast<void*>(pixels_.data())

但是,如果你想复制元素,直接使用STL函数:

  • std::copy
  • std::uninitialized_copy

它们是类型安全的,你的代码看起来更干净,性能在大多数情况下都是一样的。此外,与std::memcpy不同,它还支持非平凡的可复制类型(例如std::shared_ptr)。

记住:

我们应该忘记小的效率,说大约97%的时间:过早的优化是万恶之源。然而,我们不应该错过这关键的3%的机会。

看到TriviallyCopyable

更新:自c++ 17起,您还可以使用std::data,这将适用于任何使用连续内存存储的容器(例如std::vector, std::string, std::array)。

ColorData* buffer = std::data(pixels_);