📜  在 C++ 中切片向量

📅  最后修改于: 2021-09-03 13:56:21             🧑  作者: Mango

先决条件: C++ 中的向量

切片向量意味着从给定的向量中生成子向量。
给定向量arr 中的N 个整数以及正数X 和 Y ,任务是将给定向量从给定向量中的索引X 到 Y进行切片。

例子:

方法一:思路是把这个范围X到Y的元素复制到一个新的vector中,并返回。

  1. 获取索引 X 处元素的起始迭代器为:
    auto start = arr.begin() + X
    
  2. 获取索引 Y 处元素的结束迭代器为:
    auto end = arr.begin() + Y + 1
    
  3. 使用向量中的 copy()函数在这些迭代器之间复制这些范围内的元素。

下面是上述方法的实现:

// 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 slicing(vector& 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 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& ans)
{
  
    // Traverse the vector ans
    for (auto& it : ans) {
  
        // Print elements
        cout << it << ' ';
    }
}
  
// Driver Code
int main()
{
  
    // Given vector
    vector arr = { 1, 3, 4, 2,
                        4, 2, 1 };
  
    // Given range
    int X = 2, Y = 5;
  
    // Function Call
    vector ans;
    ans = slicing(arr, X, Y);
  
    // Print the sliced vector
    printResult(ans);
}
输出:
4 2 4 2

方法二:上述方法可以使用Range Constructor来实现。下面是上述方法的实现:

// 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 
vector slicing(vector 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 vector(first, last);
  
    // Return the results
    return vector;
}
  
// Template class to print the element
// in vector v
template 
void printResult(vector const& v)
{
  
    // Traverse the vector v
    for (auto i : v) {
        cout << i << ' ';
    }
    cout << '\n';
}
  
// Driver Code
int main()
{
  
    // Given vector
    vector arr = { 1, 3, 4, 2,
                        4, 2, 1 };
  
    // Given range
    int X = 2, Y = 5;
  
    // To store the sliced vector
    vector ans;
  
    // Function Call
    ans = slicing(arr, X, Y);
  
    // Print the sliced vector
    printResult(ans);
}
输出:
4 2 4 2

方法 3:我们也可以使用 C++ STL 中的内置函数slice() 对给定的向量进行切片。下面是上述方法的实现:

// 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 slicing(valarray 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 v)
{
  
    // Traverse the vector v
    for (auto i : v) {
        cout << i << ' ';
    }
    cout << '\n';
}
  
// Driver Code
int main()
{
  
    // Given vector
    valarray arr = { 1, 3, 4, 2,
                          4, 2, 1 };
  
    // Given range
    int X = 2, Y = 5;
  
    // To store the sliced vector
    valarray ans;
  
    // Function Call
    ans = slicing(arr, X, Y);
  
    // Print the sliced vector
    printResult(ans);
}
输出:
4 2 4 2
想要从精选的视频和练习题中学习,请查看C++ 基础课程,从基础到高级 C++ 和C++ STL 课程,了解语言和 STL。要完成从学习语言到 DS Algo 等的准备工作,请参阅完整的面试准备课程