Replace without modifying original

How do I handle cases where std::ranges::replace() should not modify the original container but create a modified copy instead?

To replace elements in a container without modifying the original, use std::ranges::replace_copy().

This function creates a new container with the modified elements, leaving the original unchanged. Here's an example:

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

int main() {
  std::vector<int> Source{1, 2, 3, 3, 3, 4, 5};
  std::vector<int> Destination(Source.size());

  std::ranges::replace_copy(
    Source, Destination.begin(), 3, 0);

  std::cout << "Original: ";
  for (const auto &num : Source) {
    std::cout << num << ", ";
  }
  std::cout << "\nModified: ";
  for (const auto &num : Destination) {
    std::cout << num << ", ";
  }
}
Original: 1, 2, 3, 3, 3, 4, 5, 
Modified: 1, 2, 0, 0, 0, 4, 5,

In this example, std::ranges::replace_copy() copies elements from Source to Destination. It replaces elements equal to 3 with 0 in the Destination container, but Source remains unchanged.

This approach is useful when you need to preserve the original data for further use or comparison. By creating a new container, you can apply transformations without risking unwanted side effects on the original dataset.

Always ensure that the destination container has sufficient size to accommodate the copied elements. You can resize the destination container beforehand, as shown in the example.

Replacement Algorithms

An overview of the key C++ standard library algorithms for replacing objects in our containers. We cover replace(), replace_if(), replace_copy(), and replace_copy_if().

Questions & Answers

Answers are generated by AI models and may not have been reviewed. Be mindful when running any code on your device.

Using Custom Comparison in replace()
Can I use std::ranges::replace() with custom comparison operators instead of ==?
Real-world uses for replace_if()
What are some practical use cases for std::ranges::replace_if() in real-world applications?
Prevent buffer overflow in replace_copy()
How do I ensure that std::ranges::replace_copy() does not cause buffer overflows in the destination container?
Transform containers with replace_copy_if()
Can std::ranges::replace_copy_if() be used to transform data from one container type to another (e.g., std::vector to std::list)?
Use replace() with non-random access iterators
Is it possible to use std::ranges::replace() with containers that do not support random access iterators?
Using replace() in multi-threaded environment
Can I use std::ranges::replace() in a multi-threaded environment, and what precautions should I take?
Or Ask your Own Question
Get an immediate answer to your specific question using our AI assistant