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

核能气质少年 提交于 2020-06-25 01:21:11

问题


I am wondering how can I convert std::vector to void*, for example,

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

Now I want to convert piexls_ to (void*) so that I can memcpy the pixels_.

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

But when I run this code, I got the error says that invalid cast from type ‘std::vector<image_tools::ColorData>’ to type ‘void*’

How can I convert std::vector to void*. Thank you so much!


回答1:


To transform your vector into a void* type, there are two options:

  • Pre C++11: (void*)&pixels_[0] (!empty() check is recommended)
  • Since C++11: static_cast<void*>(pixels_.data())

However, if you want to copy the elements, go straight with STL functions:

  • std::copy
  • std::uninitialized_copy

They are type safe, your code looks much cleaner and the performance will be on par most of the times. Also, unlike std::memcpy, it also supports non-trivially copyable types (for example std::shared_ptr).

Remember:

We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%

See TriviallyCopyable

Update: since C++17 you can also use std::data, which will work for any container using contiguous memory storage (e.g. std::vector, std::string, std::array).

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


来源:https://stackoverflow.com/questions/40594494/how-to-convert-stdvectorvector-to-void

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!