std::vector<std::vector<float>>概述及应用举例

std::vector<std::vector<float>>

std::vector<std::vector<float>> 是 C++ 标准模板库(STL)中的一个数据结构,表示一个二维向量(二维数组),其中每个元素都是一个 std::vector<float> 类型的向量,即每个内部向量都包含了一系列的浮点数(float)。

这种数据结构常用于表示二维空间中的数据,如矩阵、图像中的像素值等。其中,外层向量可以看作是行(rows),内层向量可以看作是列(columns)。每个内层向量代表矩阵的一行,内层向量中的元素则代表该行中的各个列元素。

使用 std::vector<std::vector<float>> 的好处包括:

  1. 动态大小:与普通数组不同,std::vector 可以动态地增加或减少其大小,这使得它非常适合于在运行时确定数据大小的情况。
  2. 内存管理std::vector 会自动处理内存管理,包括分配和释放内存,减少了内存泄漏的风险。
  3. 灵活性:可以轻松地访问、修改、添加或删除元素,提供了丰富的成员函数来进行操作。
  4. 兼容性好:作为 STL 的一部分,std::vector 与其他 STL 组件(如算法、迭代器)兼容,可以方便地进行各种数据处理。

例如,创建一个 3x3 的矩阵(二维向量),可以这样初始化:

#include <vector>  
  
int main() {  
    std::vector<std::vector<float>> matrix = {  
        {1.0f, 2.0f, 3.0f},  
        {4.0f, 5.0f, 6.0f},  
        {7.0f, 8.0f, 9.0f}  
    };  
  
    // 访问矩阵中的元素  
    float value = matrix[1][2]; // 访问第二行第三列的元素,值为 6.0  
  
    return 0;  
}

在这个例子中,matrix 是一个 3x3 的二维向量,通过 matrix[i][j] 的方式可以访问或修改其中的元素,其中 i 是行索引,j 是列索引。

std::vector<std::vector<float>>遍历 

在 C++ 中,std::vector<std::vector<float>> 是一个二维向量(也可以理解为矩阵),你可以通过嵌套的循环来遍历它的所有元素。以下是一个简单的示例,展示了如何遍历这样的二维向量并访问其中的每一个元素。

#include <iostream>  
#include <vector>  
  
int main() {  
    // 创建一个 3x3 的二维向量,并初始化一些值  
    std::vector<std::vector<float>> matrix = {  
        {1.1, 2.2, 3.3},  
        {4.4, 5.5, 6.6},  
        {7.7, 8.8, 9.9}  
    };  
  
    // 获取行数和列数  
    int rows = matrix.size();  
    int cols = matrix[0].size();  
  
    // 使用嵌套的循环来遍历二维向量  
    for (int i = 0; i < rows; ++i) {  
        for (int j = 0; j < cols; ++j) {  
            // 访问元素 matrix[i][j]  
            std::cout << matrix[i][j] << " ";  
        }  
        std::cout << std::endl; // 每遍历完一行,输出一个换行符  
    }  
  
    return 0;  
}

这个程序首先创建了一个 3x3 的二维向量 matrix,并使用嵌套的 for 循环来遍历其中的每一个元素。外层循环遍历行,内层循环遍历列。在每次内层循环中,通过 matrix[i][j] 访问具体的元素并输出其值。每遍历完一行,输出一个换行符以便格式化输出。

注意事项

  1. 边界检查:在访问二维向量的元素之前,确保它的大小是符合预期的。例如,上面的代码假设每一行的列数是相同的。如果实际情况可能不同,你需要在代码中添加额外的检查。

  2. 范围-based for 循环:如果你使用 C++11 及以上版本,可以采用范围-based for 循环来简化代码:

    for (const auto& row : matrix) {  
        for (float val : row) {  
            std::cout << val << " ";  
        }  
        std::cout << std::endl;  
    }

    这种方式更加简洁,并且避免了手动计算行和列的大小。

3. 性能考虑:如果你只是读取元素,上述方法是高效的。但如果你在遍历过程中修改二维向量的大小(例如添加或删除元素),则可能会导致性能问题甚至未定义行为。在这种情况下,你应该考虑其他策略。

std::vector在后面添加数据 

在 C++ 中,std::vector 是一个动态数组,它可以在运行时添加或删除元素。要在 std::vector 的末尾添加数据,你可以使用 push_back 成员函数。这个函数会将一个元素添加到向量的末尾,并自动调整向量的大小以容纳新元素。

以下是一个简单的例子,展示了如何使用 push_back 在 std::vector<float> 和 std::vector<std::vector<float>> 后面添加数据:

#include <iostream>  
#include <vector>  
  
int main() {  
    // 创建一个一维的 float 向量  
    std::vector<float> vec;  
    vec.push_back(1.0f); // 在末尾添加 1.0  
    vec.push_back(2.0f); // 在末尾添加 2.0  
    vec.push_back(3.0f); // 在末尾添加 3.0  
  
    // 输出一维向量的内容  
    for (float f : vec) {  
        std::cout << f << " ";  
    }  
    std::cout << std::endl;  
  
    // 创建一个二维的 float 向量(矩阵)  
    std::vector<std::vector<float>> matrix;  
  
    // 创建并添加第一行  
    std::vector<float> row1 = {1.1, 2.2, 3.3};  
    matrix.push_back(row1);  
  
    // 创建并添加第二行  
    std::vector<float> row2 = {4.4, 5.5, 6.6};  
    matrix.push_back(row2);  
  
    // 也可以逐行添加元素  
    std::vector<float> row3;  
    row3.push_back(7.7);  
    row3.push_back(8.8);  
    row3.push_back(9.9);  
    matrix.push_back(row3);  
  
    // 输出二维向量的内容  
    for (const auto& row : matrix) {  
        for (float f : row) {  
            std::cout << f << " ";  
        }  
        std::cout << std::endl;  
    }  
  
    return 0;  
}

在这个例子中,我们首先创建了一个一维的 std::vector<float> 并使用 push_back 添加了三个浮点数。然后,我们创建了一个二维的 std::vector<std::vector<float>>(即矩阵),并使用 push_back 添加了三行数据。每行数据本身也是一个 std::vector<float>

注意,当你向 std::vector 添加元素时,如果当前容量不足以容纳新元素,std::vector 会自动分配更大的内存空间来存储这些元素,并将现有元素复制到新的内存空间中。这个过程是自动的,但如果你知道将要添加大量元素,可以使用 reserve 成员函数来预先分配足够的内存空间,以减少内存分配和复制的次数。

猜你喜欢

转载自blog.csdn.net/xie__jin__cheng/article/details/143435675