Lesson 4

Greetings! Welcome to our lesson today where we'll unravel a fascinating aspect of **vector manipulation**. Here's the question: How would you traverse a vector not from the beginning to the end, or vice versa, but from the center outward in either direction? Today's lesson is all about exploring this concept with `C++`

. Brace yourself for a captivating learning journey.

Our task is to produce a new vector, given a vector of integers, that starts from the center of the original vector and alternates direction towards both ends. That is, the first element of our new vector will be the middle element of the original one. After defining the starting point, we will alternate between elements to the left and to the right of this center until all elements have been included. If the length of the initial array is even, we first take the the element to the left of the center, then the one to the right of the center, then do the alternation as described above.

For example, for `numbers = {1, 2, 3, 4, 5}`

, the output would be `{3, 2, 4, 1, 5}`

.

We break down this seemingly complex task into manageable pieces to progressively build our `C++`

function. Keep in mind an additional condition: the length of the vector — represented as `n`

— can range from `1`

to `100,000`

, inclusive.

First, let's establish the midpoint of our vector. Our task requires us to expand our vector from the center to the ends, so we divide its length by 2 using integer division in `C++`

. If we find that the vector's length is odd, we include the middle element in the `newOrder`

vector, given it has no counterpart. If the vector's length is even, `newOrder`

initially remains empty.

Here is how it looks in `C++`

:

C`1std::vector<int> iterateMiddleToEnd(std::vector<int> &numbers) { 2 int mid = numbers.size() / 2; // index of the left middle element 3 std::vector<int> newOrder; // vector to store new order 4 5 if(numbers.size() % 2 == 1) { 6 newOrder.push_back(numbers[mid]); // Adding middle element to resulting vector if length is odd 7 } 8 // newOrder remains empty for now if length is even`

Successfully solving our task requires two pointers: `left`

and `right`

. These pointers are initialized to point to the elements immediately to the left and right of the middle element, respectively.

Here is the `C++`

function with the added initialization of these pointers:

C`1std::vector<int> iterateMiddleToEnd(std::vector<int>& numbers) { 2 int mid = numbers.size() / 2; // index of the left middle element 3 int left, right; 4 std::vector<int> newOrder; // vector to store new order 5 6 if (numbers.size() % 2 == 1) { 7 left = mid - 1; // Pointing to the left to the middle element 8 right = mid + 1; // Pointing to the right of the middle element 9 newOrder.push_back(numbers[mid]); // Adding the middle element to the resulting vector 10 } 11 else { 12 left = mid - 1; // Pointing to the left middle element 13 right = mid; // Pointing to the right middle element 14 }`

With our pointers initialized, it's time to navigate the vector and form our new order. In `C++`

, while loops provide the necessary control structure to iterate from the center of the vector to both ends. In each iteration, we push the elements at indices `left`

and `right`

to the `newOrder`

vector, decrement `left`

by one and increment `right`

by one.

Here's how it looks when we put together the full `C++`

function:

C`1#include <iostream> 2#include <vector> 3 4std::vector<int> iterateMiddleToEnd(std::vector<int>& numbers) { 5 int mid = numbers.size() / 2; // index of the left middle element 6 int left, right; 7 std::vector<int> newOrder; // vector to store new order 8 9 if (numbers.size() % 2 == 1) { 10 left = mid - 1; // Pointing to the left to the middle element 11 right = mid + 1; // Pointing to the right of the middle element 12 newOrder.push_back(numbers[mid]); // Adding the middle element to the resulting vector 13 } 14 else { 15 left = mid - 1; // Pointing to the left middle element 16 right = mid; // Pointing to the right middle element 17 } 18 19 while (left >= 0 && right < numbers.size()) { 20 newOrder.push_back(numbers[left--]); 21 newOrder.push_back(numbers[right++]); 22 } 23 24 return newOrder; 25}`

By implementing this approach, we have successfully created a new vector, starting from the middle and alternating to the left and right ends of the original vector, effectively fulfilling the requirements of our task!

Well done on reaching the end of this lesson! You've uncovered a riveting method of traversing and manipulating vectors! Take a moment to pat yourself on the back for understanding and implementing this concept. As the proverb goes, practice makes perfect. Hence, I encourage you to employ this concept in similar problems. Your exceptional journey in mastering algorithms with `C++`

has just begun. Embrace the challenge and happy coding!