如果我想逐行逐列地浏览这样的矢量,我需要做哪些更改?
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 ...
}
}
由于
答案 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);
}
}
}