O std :: copy manipula intervalos sobrepostos?

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.