迭代器 2D 向量列

Iterator 2D vector by column

本文关键字:向量 2D 迭代器      更新时间:2023-10-16

如果我想逐列而不是逐行遍历这样的向量,我需要做哪些更改?

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(的原因,或者您可以自己进行边界检查。