Lesson 3
Modifying Ranges In Place with Boost.Range
Lesson Introduction

Welcome back! In this lesson, we'll explore modifying ranges in place using the Boost.Range library. This technique lets you transform container contents directly, making your code more efficient by avoiding intermediate copies.

Today, we will learn to remove elements from a container in place, understand how to add elements efficiently, and combine both operations to harness Boost.Range's power in place modifications.

Let’s start by understanding the benefits of in-place modifications.

In-Place Modification: Removing Elements

One common task is removing elements based on conditions. With Boost.Range, you can do this efficiently using boost::range::remove_erase_if. Here's an example of removing all odd numbers from a vector:

C++
1#include <boost/range/algorithm_ext/erase.hpp> 2#include <vector> 3#include <iostream> 4 5bool is_odd(int x) { 6 return x % 2 != 0; 7} 8 9int main() { 10 std::vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 11 12 // Remove all odd numbers in place 13 boost::range::remove_erase_if(nums, is_odd); 14 15 for (int n : nums) { 16 std::cout << n << " "; 17 } 18 19 // Output: 2 4 6 8 20 21 return 0; 22}
  1. Predicate Function: is_odd checks if a number is odd.
  2. Removing Elements: boost::range::remove_erase_if takes nums and the is_odd predicate, removing all elements for which the predicate returns true, modifying the vector in place.

Removing elements in place saves memory and improves performance, especially for larger containers.

In-Place Modification: Adding Elements

The Boost.Range library's boost::range::push_back function appends elements from one range to another without manual loops. Here's how to use push_back to add elements to a vector:

C++
1#include <boost/range/algorithm_ext/push_back.hpp> 2#include <vector> 3#include <iostream> 4 5int main() { 6 std::vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 7 std::vector<int> more_nums = {10, 11, 12}; 8 9 // Add more elements 10 boost::range::push_back(nums, more_nums); 11 12 for (int n : nums) { 13 std::cout << n << " "; 14 } 15 16 // Output: 1 2 3 4 5 6 7 8 9 10 11 12 17 18 return 0; 19}
  1. Source Vector: more_nums contains elements to add to nums.
  2. Appending Elements: boost::range::push_back appends all elements from more_nums to nums.

This simplifies code and ensures efficient element addition.

If you use multiple functions in your code, you can include <boost/range/algorithm_ext.hpp>, which contains all these functions.

Lesson Summary

In this lesson, we covered:

  • Removing elements in place with boost::range::remove_erase_if.
  • Adding elements efficiently using boost::range::push_back

Now, it’s time to practice modifying ranges in place using Boost.Range. You’ll complete tasks involving removing and adding elements to containers. This hands-on experience will reinforce your understanding and application of these powerful techniques. Happy coding!

Enjoy this lesson? Now it's time to practice with Cosmo!
Practice is how you turn knowledge into actual skills.