2016-11-14 1 views
2

Мне интересно, как я могу преобразовать зЬй :: вектор к аннулированию *, например,как преобразовать зЬй :: вектор <vector> опорожнить *

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*’

Как я могу преобразовать станд :: вектор к аннулированию *. Спасибо огромное!

+6

Почему бы не просто скопировать вектор регулярно? Многие реализации будут вызывать memcpy внутренне, если это тип POD. Это выглядит для меня преждевременной оптимизацией. – NathanOliver

+0

... или & * sourceBuffer.pixels.begin(), и & sourceBuffer.pixels.front(). –

+2

В C++ 11 у вас есть функция '.data()', чтобы получить указатель на базовые данные. В противном случае вы можете сделать '& vec [0]'. Но это только если вам действительно нужно, потому что обычно есть намного лучший способ (например, упомянутая std :: copy). – RyanP

ответ

10

Чтобы превратить ваш вектор в void* типа, есть два варианта:

  • Pre 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() 'будет возвращать итератор * last-end-end *, поэтому ничего не будет фактически скопировано. –