Copying Algorithms

Handling Overlapping Ranges when Copying

How can I handle copying objects when the source and destination ranges overlap in complex ways?

Abstract art representing computer programming

Handling overlapping ranges can be tricky because the default behavior of std::ranges::copy() and std::ranges::copy_backward() assumes non-overlapping ranges.

When the ranges overlap, you need to be careful to avoid undefined behavior.

If the destination is to the right of the source within the same container, you should use std::ranges::copy_backward() instead of std::ranges::copy().

This ensures that elements are copied from the end of the range to the beginning, preserving the order of elements. Here’s an example:

#include <algorithm>
#include <iostream>
#include <vector>

int main() {
  std::vector<int> Values{1, 2, 3, 0, 0};

  std::ranges::copy_backward(
    Values.begin(), Values.begin() + 3,
    Values.end()); 

  for (int Value : Values) {
    std::cout << Value << ", ";
  }
}
1, 2, 1, 2, 3,

In this example, using std::ranges::copy_backward() ensures that elements are copied correctly even though the destination overlaps with the source.

If the destination is to the left of the source, you can safely use std::ranges::copy(). Here’s an example:

#include <algorithm>
#include <iostream>
#include <vector>

int main() {
  std::vector<int> Values{0, 0, 1, 2, 3};

  std::ranges::copy(
    Values.begin() + 2, Values.end(),
    Values.begin()); 

  for (int Value : Values) {
    std::cout << Value << ", ";
  }
}
1, 2, 3, 2, 3,

In this case, std::ranges::copy() works correctly because the destination is to the left of the source range.

When dealing with more complex overlaps, you might need to divide the range into non-overlapping sub-ranges and handle each one appropriately. Always ensure that you understand the layout of your source and destination ranges to choose the correct algorithm.

Answers to questions are automatically generated and may not have been reviewed.

Free, Unlimited Access

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

Screenshot from Warhammer: Total War
Screenshot from Tomb Raider
Screenshot from Jedi: Fallen Order
Contact|Privacy Policy|Terms of Use
Copyright © 2024 - All Rights Reserved