迭代器 2D 向量列
Iterator 2D vector by column
如果我想逐列而不是逐行遍历这样的向量,我需要做哪些更改?
vector<vector<bool>> vvi(nLin, vector<bool>(nCol, false));
vector< vector<bool> >::iterator row;
vector<bool>::iterator col;
for (row = vvi.begin(); row != vvi.end(); row++) {
for (col = row->begin(); col != row->end(); col++) {
// do stuff ...
}
}
谢谢
由于您知道列数 nCol,因此您可以通过以下方式生成迭代器:
for (size_t colNo = 0; colNo < nCol; ++colNo) {
for (const auto& row: vvi) {
auto it = row.begin() + colNo;
// do stuff
}
}
如果您实际上不需要迭代器:
for (size_t colNo = 0; colNo < nCol; ++colNo) {
for (const auto& row: vvi) {
bool colVal = row.at(colNo);
// do stuff
}
}
如果要为此使用vector<vector<T>>
,则只能按一个顺序进行迭代。请注意,这既不是逐行也不是逐列,而是实际上逐向量。每个子向量都有完全独立于另一个向量的存储分配,甚至可以具有不同的长度,因此很难将其称为"行"。
如果你想要一个类似矩阵(一般类似张量)的存储,你应该考虑使用一些提供这种(STL没有)的库,例如OpenCV,或者将单个连续vector
包装到你自己的类中,进行索引。
struct Matrix {
std::vector<bool> storage;
int ncols;
Matrix(int nrows, int ncols) : storage(nrows * ncols), ncols(ncols) {}
bool& operator[](int row, int col) {
return storage[row * ncols + col];
}
};
然后,您可以使用普通for
循环进行迭代或编写自己的迭代器。
如果工作量太大,你可以坚持使用vector<vector<bool>>
但使用operator[]
而不是迭代器:
for (int col = 0; col < nCols; ++col) {
for (int row = 0; row < nRows; ++row) {
bool& el = vvi[row][col];
// do stuff on el
}
}
不要使用迭代器:
int row = 0; // V You could also use ncol below, if you know it wont change.
for (int col = 0; col < vvi.at(row).size(); col++) {
for (row = 0; row < vvi.size(); row++) {
// get current value by vvi.at(row).at(col)
}
}
但是,如果您不知道每行的大小相同,这是不安全的。这就是我们使用.at(
的原因,或者您可以自己进行边界检查。
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 如何在C++或OpenCV子矩阵中的2D子向量上使用OpenACC?
- 哪个更快:在 1d 向量中按字符串搜索还是在 2d 向量中按向量搜索?
- 分配具有 2D 向量大小的变量的内存
- 根据组件 1、2(和 3)对空间 (2D/3D) 向量进行排序
- 在统一内存 CUDA C/C++ 中分配 2D 向量
- 索引 2D 向量时'Reference to type const..'编译错误
- 查找 2D 向量的位置,该向量是类C++的一个元素
- 如何在 C++ 中的函数中传递 2D 向量的子向量
- 为 2D 向量类创建标量乘法运算符
- 无法使用push_back将整数插入1D/2D向量
- 如何将列附加到现代C 中的2D向量
- 如何声明和初始化一个特定尺寸向量的2D数组
- 如何计算 2D 数组中每行的总和并放置在向量中
- 在不使用递归的情况下求解所有 2D 字符串向量组合?(C++)
- 在类中创建向量(2D 数组)的向量 - Error:C++ 需要所有声明的类型说明符
- 在C++中使用向量的向量(2D 向量)表示邻接列表
- 将向量(2D数组)的向量重置为零