2016-11-14 404 views
2

我想知道我怎么可以转换的std ::向量为void *,例如,怎样的std ::矢量<vector>为void *转换

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

现在我想piexls_转换为(无效*)这样我可以memcpy像素_。

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

但是当我运行这段代码,我得到了错误说invalid cast from type ‘std::vector<image_tools::ColorData>’ to type ‘void*’

我怎么能转换的std ::向量为void *。非常感谢!

+6

为什么不经常复制载体?如果它是POD类型,许多实现将在内部调用memcpy。这看起来像是一个过早的优化。 – NathanOliver

+0

...或者* sourceBuffer.pixels.begin()或者&sourceBuffer.pixels.front()。 –

+2

在C++ 11中,您有'.data()'函数来获取指向底层数据的指针。否则,你可以执行'&vec [0]'。但是,只有当你真的需要,因为通常有更好的方法(如提到的std :: copy)。 – RyanP

回答

10

改变你的载体导入void*类型,有两种选择:

  • 预C++ 11:(void*)&piexls_[0](推荐!empty()检查)
  • 由于C++ 11:static_cast<void*>(piexls_.data())

但是,如果要复制元素,请直接使用STL功能:

他们是类型安全的,你的代码看起来更清洁,性能将看齐大部分的时间。

记住:

我们应该忘记小的效率,讲的时候约97%:过早的优化是所有罪恶的根源。然而,我们不应该在关键的3%

错过我们的机会见TriviallyCopyable

+0

优秀!值得一提的是:'std :: copy()'的性能不会像所有的期望一样好,至少对于memcpy()来说,至少对于微不足道的可复制类型来说。 – Christophe

+1

请注意,&piexls_ [0]要求您有一个非空向量。最好是在复制之前检查是否有任何元素。似乎.data()避免了(以及使用std :: copy)。 –

+1

谢谢。对索引来说是正确的,尽管'operator []'没有执行任何边界检查,但不使用检查就不好使用它。对于'std :: copy'是没有必要的,因为'begin()'将返回一个* past-the-end *迭代器,所以实际上没有任何东西会被复制。 –

相关问题