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 = 5
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.
- Get the starting iterator of element at index X as:
auto start = arr.begin() + X
- Get the ending iterator of element at index Y as:
auto end = arr.begin() + Y + 1
- Copy the elements in these range between these iterators using copy() function in vector.
Below is the implementation of the above approach:
CPP
// 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); } |
4 2 4 2
Method 2: The above approach can be implemented using Range Constructor. Below is the implementation of the above approach:
CPP
// 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); } |
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:
CPP
// 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); } |
4 2 4 2
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!