📜  如何在 C++ 中展平向量的向量或二维向量(1)

📅  最后修改于: 2023-12-03 15:24:08.251000             🧑  作者: Mango

如何在 C++ 中展平向量的向量或二维向量

在 C++ 中,如果我们需要在程序中处理向量的向量或二维向量,我们通常需要将它们“展平”为一个一维向量,以便更方便地进行计算和操作。在本文中,我们将介绍如何在 C++ 中展平向量的向量或二维向量。

一维向量和二维向量

在 C++ 中,我们通常使用 std::vector 来表示向量。一维向量可以表示为:

std::vector<int> v1; // 一维向量,包含若干个整数

二维向量可以表示为一个向量的向量:

std::vector<std::vector<int>> v2; // 二维向量,包含若干个一维向量

或者表示为一个行向量与列向量的组合:

std::vector<std::vector<int>> v3(rows, std::vector<int>(cols)); // 二维向量,包含 rows 个行向量,每个行向量包含 cols 个整数
展平一维向量

展平一维向量非常简单,只需要使用 std::copy 函数将其复制到另一个一维向量中即可:

std::vector<int> v1{1, 2, 3};
std::vector<int> v1_flat(v1.size());

std::copy(v1.begin(), v1.end(), v1_flat.begin());

// 输出: 1 2 3
for (auto i : v1_flat) {
    std::cout << i << " ";
}
展平二维向量

展平二维向量比较复杂。我们需要创建一个新的一维向量,将二维向量中的所有元素依次复制到其中。我们可以使用两种方法来完成这个操作。

方法一:使用双重循环

我们可以使用双重循环,将二维向量中每个一维向量中的元素依次添加到新的一维向量中:

std::vector<std::vector<int>> v2{{1, 2}, {3, 4, 5}, {6}};
std::vector<int> v2_flat;

for (const auto& v : v2) {
    for (const auto& el : v) {
        v2_flat.push_back(el);
    }
}

// 输出: 1 2 3 4 5 6
for (auto i : v2_flat) {
    std::cout << i << " ";
}
方法二:使用算法

C++ 17 为我们提供了 std::accumulate 算法。为了使用 std::accumulate 展平二维向量,我们需要两个辅助函数:

// 将一个一维向量连接到另一个一维向量后面
template <typename T>
void append(std::vector<T>& v, const std::vector<T>& w) {
    v.insert(v.end(), w.begin(), w.end());
}

// 将一个一维向量连接到另一个二维向量后面
template <typename T>
void append(std::vector<std::vector<T>>& v, const std::vector<T>& w) {
    v.emplace_back(w);
}

接下来我们可以使用 std::accumulate 算法和这两个辅助函数来展平二维向量:

std::vector<std::vector<int>> v2{{1, 2}, {3, 4, 5}, {6}};
std::vector<int> v2_flat;

std::accumulate(v2.begin(), v2.end(), std::ref(v2_flat), append<int>);

// 输出: 1 2 3 4 5 6
for (auto i : v2_flat) {
    std::cout << i << " ";
}
结论

在 C++ 中展平向量的向量或二维向量并不是一件困难的事情,我们只需要使用 std::copy 函数或者 std::accumulate 算法即可。当然,方法一也是一个可行的选择,但是相对来说,它要略显繁琐。