Ao copiar dados de um intervalo para outro, você deve ter cuidado se houver sobreposição parcial entre os intervalos de origem e de destino. Se o início do intervalo de destino se sobrepuser à cauda do intervalo de origem, uma cópia sequencial simples irá desfigurar os dados. A biblioteca de tempo de execução C tem memmove
além de memcpy
para lidar com esses problemas de sobreposição.
Eu assumo std::copy
funciona como memcpy
, em que não tem qualquer consideração sobre a sobreposição entre as regiões de origem e destino. Se você tentar deslocar objects “para baixo” em um std::vector
com std::copy
, você corromperá os dados. Existe um algoritmo STL análogo do memmove
para lidar com situações como esta? Ou eu deveria fazer o meu próprio com iteradores reversos?
Ele não lida com intervalos sobrepostos se o início do intervalo de saída se sobrepuser ao intervalo de input.
Felizmente, você pode usar std::copy_backward
(o que requer que você não se sobreponha ao final do intervalo de saída com o intervalo de input).
Pré-condições para std::copy
, proíbe uma sobreposição:
Protótipo
template
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result); Condições prévias
[first, last)
é um intervalo válido.- resultado não é um iterador dentro do intervalo
[first, last)
.- Há espaço suficiente para armazenar todos os elementos que estão sendo copiados. Mais formalmente, o requisito é que
[result, result + (last - first))
é um intervalo válido. [1]
Parece que o caminho mais direto seria criar um vetor temporário do intervalo que você deseja copiar:
std::vector copiedRange( srcVecIterBegin, srcVecIterEnd); std::copy( copiedRange.begin(), copiedRange.end(), srcVecIterCopyLocIter);
Você pode envolver isso em uma function de modelo que deve ser habilmente para fazer uma sobreposição usando qualquer tipo de contêiner / iterador.