При копировании данных от одного диапазона до другого необходимо быть осторожными, если существует частичное перекрытие между источником и целевыми диапазонами. Если начало целевого диапазона перекроет хвост исходного диапазона, то простая последовательная копия исказит данные. Библиотека времени выполнения C имеет memmove
в дополнение к memcpy
решить такие проблемы перекрытия.
Я принимаю std::copy
работы как memcpy
, в этом это не обращает внимания для наложения между источником и целевыми регионами. При попытке сместить объекты "вниз" в a std::vector
с std::copy
, Вы повредите данные. Есть ли аналог алгоритма STL memmove
обработать такие ситуации? Или я должен прокрутить свое собственное с обратными итераторами?
Он не обрабатывает перекрывающиеся диапазоны, если начало выходного диапазона перекрывается с входным диапазоном.
К счастью, вы можете использовать std :: copy_backward
вместо этого (что требует, чтобы вы не перекрывали конец диапазона вывода входным диапазоном).
Предварительные условия для std :: copy
, запрещает перекрытие:
Прототип
шаблон <класс InputIterator, класс OutputIterator> Копия OutputIterator (сначала InputIterator, затем - InputIterator, Результат OutputIterator);
Предварительные условия
[первый, последний)
- допустимый диапазон.- результат не является итератором в диапазоне
[первый, последний)
.- Достаточно места для удерживать все копируемые элементы. Больше формально требуется, чтобы
[результат, результат + (последний - первый))
является допустимый диапазон. [1]
Кажется, наиболее простым способом было бы создать временный вектор диапазона, который вы хотите скопировать:
std::vector copiedRange( srcVecIterBegin, srcVecIterEnd);
std::copy( copiedRange.begin(), copiedRange.end(), srcVecIterCopyLocIter);
Вы можете обернуть это в шаблонную функцию, которая должна уметь выполнять перекрываются с использованием любого типа контейнера / итератора.