Slicing a Vector in C++

Pre-requisite: Vectors in C++

Slicing a vector means to make a subvector from a given vector.
Given N integers in a vector arr and to positive numbers X and Y, the task is to slice the given vector from index X to Y in a given vector.

Examples:

Input: vector arr = { 1, 3, 4, 2, 4, 2, 1 }, X = 2, Y = 4
Output: 4 2 4 2

Input: vector arr = { 1, 3, 4, 2 }, X = 1, Y = 2
Output: 3 4



Method 1: The idea is to copy the elements from this range X to Y to a new vector and return it.

  1. Get the starting iterator of element at index X as:
    auto start = arr.begin() + X
    
  2. Get the ending iterator of element at index Y as:
    auto end = arr.begin() + Y + 1
    
  3. Copy the elements in these range between these iterators using copy() function in vector.

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include "bits/stdc++.h"
using namespace std;
  
// Function to slice a given vector
// from range X to Y
vector<int> slicing(vector<int>& arr,
                    int X, int Y)
{
  
    // Starting and Ending iterators
    auto start = arr.begin() + X;
    auto end = arr.begin() + Y + 1;
  
    // To store the sliced vector
    vector<int> result(Y - X + 1);
  
    // Copy vector using copy function()
    copy(start, end, result.begin());
  
    // Return the final sliced vector
    return result;
}
  
// Function to print the vector ans
void printResult(vector<int>& ans)
{
  
    // Traverse the vector ans
    for (auto& it : ans) {
  
        // Print elements
        cout << it << ' ';
    }
}
  
// Driver Code
int main()
{
  
    // Given vector
    vector<int> arr = { 1, 3, 4, 2,
                        4, 2, 1 };
  
    // Given range
    int X = 2, Y = 5;
  
    // Function Call
    vector<int> ans;
    ans = slicing(arr, X, Y);
  
    // Print the sliced vector
    printResult(ans);
}

chevron_right


Output:

4 2 4 2

Method 2: The above approach can be implemented using Range Constructor. Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include "bits/stdc++.h"
using namespace std;
  
// Template class to slice a vector
// from range X to Y
template <typename T>
vector<T> slicing(vector<T> const& v,
                  int X, int Y)
{
  
    // Begin and End iterator
    auto first = v.begin() + X;
    auto last = v.begin() + Y + 1;
  
    // Copy the element
    vector<T> vector(first, last);
  
    // Return the results
    return vector;
}
  
// Template class to print the element
// in vector v
template <typename T>
void printResult(vector<T> const& v)
{
  
    // Traverse the vector v
    for (auto i : v) {
        cout << i << ' ';
    }
    cout << '\n';
}
  
// Driver Code
int main()
{
  
    // Given vector
    vector<int> arr = { 1, 3, 4, 2,
                        4, 2, 1 };
  
    // Given range
    int X = 2, Y = 5;
  
    // To store the sliced vector
    vector<int> ans;
  
    // Function Call
    ans = slicing(arr, X, Y);
  
    // Print the sliced vector
    printResult(ans);
}

chevron_right


Output:

4 2 4 2

Method 3: We can also use inbuilt function slice() in C++ STL to slice the given vector. Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include "bits/stdc++.h"
#include "valarray"
using namespace std;
  
// Function to slice the given array
// elements from range (X, Y)
valarray<int> slicing(valarray<int> arr,
                      int X, int Y)
{
  
    // Return the slicing of array
    return arr[slice(X, Y - X + 1, 1)];
}
  
// Print the resultant array
// after slicing
void printResult(valarray<int> v)
{
  
    // Traverse the vector v
    for (auto i : v) {
        cout << i << ' ';
    }
    cout << '\n';
}
  
// Driver Code
int main()
{
  
    // Given vector
    valarray<int> arr = { 1, 3, 4, 2,
                          4, 2, 1 };
  
    // Given range
    int X = 2, Y = 5;
  
    // To store the sliced vector
    valarray<int> ans;
  
    // Function Call
    ans = slicing(arr, X, Y);
  
    // Print the sliced vector
    printResult(ans);
}

chevron_right


Output:

4 2 4 2

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.