vector 的切片或子向量#
探索如何在 C++ 中从给定的向量获取切片或子向量。
使用 Range 构造#
核心思想是获取 vector 的起始和结束位置的输入迭代器,并将它们传递给 vector 类的 Range 构造函数以获得子 vector。
#include <iostream>
#include <vector>
#include <sstream>
#include<string>
// std::ostringstream oss;
创建简单向量:
std::vector<int> v = { 1, 2, 3, 4, 2, 2, 4, 6, 5 };
v
{ 1, 2, 3, 4, 2, 2, 4, 6, 5 }
构建切片函数:
template<typename T>
std::vector<T> slice(std::vector<T> const &v, int m, int n)
{
auto first = v.cbegin() + m;
auto last = v.cbegin() + n + 1;
std::vector<T> vec(first, last);
return vec;
}
测试:
std::vector<int> sub_vec = slice(v, 4, 7);
sub_vec
{ 2, 2, 4, 6 }
使用 std::copy()
函数#
我们还可以使用标准算法 std::copy()
将一个向量的一部分复制到另一个向量,如下所示:
template<typename T>
std::vector<T> slice(std::vector<T> &v, int m, int n)
{
std::vector<T> vec(n - m + 1);
std::copy(v.begin() + m, v.begin() + n + 1, vec.begin());
return vec;
}
在调用 std::copy
之前,确保目标向量有足够的空间容纳所有元素。如果不是这样,最好使用 std::back_insert
迭代器,它将在指定的向量上调用 push_back()
,如下所示:
template<typename T>
std::vector<T> slice(std::vector<T> &v, int m, int n)
{
std::vector<T> vec;
std::copy(v.begin() + m, v.begin() + n + 1, std::back_inserter(vec));
return vec;
}