如何在C++中扁平化向量或2D向量
什么是向量?
在数学中,向量是一个带有方向和大小的量,主要用于表示力、速度、加速度等物理量。在计算机科学中,向量表示在n维空间中的一个点,可以用来表示二维或三维图形中的位置、方向、速度等。
在C++中,使用数组或std::vector来表示向量。
扁平化向量
扁平化向量指将一个n维向量(二维向量为2维向量,三维向量为3维向量,以此类推)转化为一个一维数组的过程。这种操作主要用于将多维数据序列化为一维数组,方便传输和存储。
下面是一个示例代码实现:
#include <iostream>
#include <vector>
using namespace std;
template<typename T, size_t N>
void flatten(const array<T, N>& src, vector<T>& dst) {
for (const auto& v : src) {
if constexpr (is_same_v<T, decltype(v)> && is_array_v<decltype(v)>) {
flatten(v, dst);
} else {
dst.push_back(v);
}
}
}
int main()
{
array<array<int,3>, 4> vec2d{{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}};
vector<int> vec1d;
flatten(vec2d, vec1d);
for (const auto& v : vec1d) {
cout << v << ", ";
}
cout << endl;
return 0;
}
上面的示例代码实现了将一个二维向量扁平化为一个一维数组,输出结果为:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
我们可以利用递归的方式将二维向量转换为一维向量,逐层拆解直到只剩下一个元素,然后将元素加入到一维向量中。
2D向量变为一维向量
如果是一个二维的向量,也可以将它转换为一个一维的向量,如下所示:
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
vector<T> flatten2d(const vector<vector<T>>& src) {
vector<T> dst;
for (const auto& v : src) {
dst.insert(dst.end(), v.begin(), v.end());
}
return dst;
}
int main()
{
vector<vector<int>> vec2d{{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}};
vector<int> vec1d = flatten2d(vec2d);
for (const auto& v : vec1d) {
cout << v << ", ";
}
cout << endl;
return 0;
}
上面的示例代码实现了将一个二维向量扁平化为一个一维数组,输出结果为:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
我们可以直接遍历二维向量,将每一行的元素添加到一维向量中,从而将二维向量转换为一维向量。
结论
本文介绍了如何在C++中扁平化向量或2D向量,通过示例代码演示了如何将二维向量转换为一维向量,并且将多维向量扁平化为一维数组。扁平化向量是一种序列化数据的方式,能够方便地存储和传输数据,具有广泛的应用。