vector 的切片或子向量

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;
}