如何在C++中扁平化向量或2D向量

如何在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向量,通过示例代码演示了如何将二维向量转换为一维向量,并且将多维向量扁平化为一维数组。扁平化向量是一种序列化数据的方式,能够方便地存储和传输数据,具有广泛的应用。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程