std::vector<std::vector<float>>
std::vector<std::vector<float>>
是 C++ 标准模板库(STL)中的一个数据结构,表示一个二维向量(二维数组),其中每个元素都是一个 std::vector<float>
类型的向量,即每个内部向量都包含了一系列的浮点数(float
)。
这种数据结构常用于表示二维空间中的数据,如矩阵、图像中的像素值等。其中,外层向量可以看作是行(rows),内层向量可以看作是列(columns)。每个内层向量代表矩阵的一行,内层向量中的元素则代表该行中的各个列元素。
使用 std::vector<std::vector<float>>
的好处包括:
- 动态大小:与普通数组不同,
std::vector
可以动态地增加或减少其大小,这使得它非常适合于在运行时确定数据大小的情况。 - 内存管理:
std::vector
会自动处理内存管理,包括分配和释放内存,减少了内存泄漏的风险。 - 灵活性:可以轻松地访问、修改、添加或删除元素,提供了丰富的成员函数来进行操作。
- 兼容性好:作为 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]
访问具体的元素并输出其值。每遍历完一行,输出一个换行符以便格式化输出。
注意事项
-
边界检查:在访问二维向量的元素之前,确保它的大小是符合预期的。例如,上面的代码假设每一行的列数是相同的。如果实际情况可能不同,你需要在代码中添加额外的检查。
-
范围-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
成员函数来预先分配足够的内存空间,以减少内存分配和复制的次数。