迭代器2D矢量列

时间:2016-05-26 19:08:36

标签: c++

如果我想逐行逐列地浏览这样的矢量,我需要做哪些更改?

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 ...
        }
    }

由于

4 个答案:

答案 0 :(得分:2)

由于您知道列数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
    }
}

答案 1 :(得分:1)

如果您想使用vector<vector<T>>,那么您只能按一个顺序进行迭代。请注意,这既不是逐行也不是逐列,而是实际上是逐矢量的。每个子向量的存储分配完全独立于另一个向量,甚至可能具有不同的长度,因此很难称之为&#34; row&#34;。

如果你想要类似矩阵(一般的张量)存储,你应该考虑使用一些提供它的库(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
   }
}

答案 2 :(得分:0)

不要使用迭代器:

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(或你可以做自己的边界检查。

答案 3 :(得分:-1)

我有一个用Java编写的答案,它需要O(行数)空间:

public static void main(String[] args) {
    List<List<Integer>> list = new ArrayList<>();
    list.add(Arrays.asList(1,5,8));
    list.add(Arrays.asList(2));
    list.add(Arrays.asList(3,6,9,11,13));
    list.add(Arrays.asList(4,7,10,12));

    LinkedList<Iterator<Integer>> queue = new LinkedList<>();
    Iterator<List<Integer>> iterator = list.iterator();
    while (iterator.hasNext()) {
        queue.add(iterator.next().iterator());
    }

    while (!queue.isEmpty() && queue.peekFirst().hasNext()) {
        System.out.println(queue.peekFirst().next());
        Iterator<Integer> garbage = queue.removeFirst();
        if (garbage.hasNext()) {
            queue.add(garbage);
        }
    }
}