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.


Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.