Делает станд.:: скопировать диапазоны наложения дескриптора?

При копировании данных от одного диапазона до другого необходимо быть осторожными, если существует частичное перекрытие между источником и целевыми диапазонами. Если начало целевого диапазона перекроет хвост исходного диапазона, то простая последовательная копия исказит данные. Библиотека времени выполнения C имеет memmove в дополнение к memcpy решить такие проблемы перекрытия.

Я принимаю std::copy работы как memcpy, в этом это не обращает внимания для наложения между источником и целевыми регионами. При попытке сместить объекты "вниз" в a std::vector с std::copy, Вы повредите данные. Есть ли аналог алгоритма STL memmove обработать такие ситуации? Или я должен прокрутить свое собственное с обратными итераторами?

21
задан Adrian McCarthy 3 June 2012 в 23:34
поделиться

3 ответа

Он не обрабатывает перекрывающиеся диапазоны, если начало выходного диапазона перекрывается с входным диапазоном.

К счастью, вы можете использовать std :: copy_backward вместо этого (что требует, чтобы вы не перекрывали конец диапазона вывода входным диапазоном).

18
ответ дан 29 November 2019 в 21:35
поделиться

Предварительные условия для std :: copy , запрещает перекрытие:

  • Прототип

     шаблон <класс InputIterator, класс OutputIterator>
    Копия OutputIterator (сначала InputIterator, затем - InputIterator,
     Результат OutputIterator);
    
  • Предварительные условия

    • [первый, последний) - допустимый диапазон.
    • результат не является итератором в диапазоне [первый, последний) .
    • Достаточно места для удерживать все копируемые элементы. Больше формально требуется, чтобы [результат, результат + (последний - первый)) является допустимый диапазон. [1]
9
ответ дан 29 November 2019 в 21:35
поделиться

Кажется, наиболее простым способом было бы создать временный вектор диапазона, который вы хотите скопировать:

std::vector copiedRange( srcVecIterBegin, srcVecIterEnd);
std::copy( copiedRange.begin(), copiedRange.end(), srcVecIterCopyLocIter);

Вы можете обернуть это в шаблонную функцию, которая должна уметь выполнять перекрываются с использованием любого типа контейнера / итератора.

0
ответ дан 29 November 2019 в 21:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: