【问题标题】:missing rows with cout for 2d vector in c++c++ 中二维向量的 cout 缺失行
【发布时间】:2016-02-02 13:32:10
【问题描述】:

我很疯狂,无法解释这里发生的事情。

#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

int main() {
    int i = 0, j = 0, m = 3, n = 3;
    vector<vector<int> > vvi(3, vector<int>(3, 1));

    // why the following code outputs only single row, 
    // i.e.,"111" from vvi[0]? what about vvi[1], vvi[2]?
    for(; i < m; ++i) {
        for(; j< n; ++j) {
            cout << vvi[i][j];
        }
    }
    // any difference from the code below? 
    // for(int i=0; i < m; ++i) {
    //   for(int j= 0; j< n; ++j) {
    //      cout << vvi[i][j];
    //   }
    // }
}

【问题讨论】:

  • 注释掉的代码当然是正确的。它还说明了为什么在首次使用它们的地方初始化值是有帮助的。没有理由在main 的顶部定义ij。在我评论代码时,将vvi 定义中的两个3s 替换为mn

标签: c++ vector stdout cout


【解决方案1】:

在外循环的第一次迭代中,计数器变量 j0 递增到 n,但由于它永远不会重置为 0,它保持在 n,因此是内循环条件对于外循环的所有后续迭代,j &lt; n 为 false。因此cout 将永远不会被再次执行。

在您注释掉的代码中,j 在外循环的每次迭代中都会重置(重新初始化)为0,因此它将打印所有行。

【讨论】:

  • 啊哈,是的,我的大脑肯定卡在这里了。你们都打我。谢谢!!
【解决方案2】:

在第一个中,当vvi[0] 完成时,j3
当它转到vvi[1] 时,j 仍然是3 所以j &lt; n 是假的。

在第二个中,当外循环开始第二次迭代时,j 将再次设置为0

此代码与第二个代码等效(在结果中):

    for(; i < m; ++i) {
        for(j = 0; j< n; ++j) {
            cout << vvi[i][j];
        }
    }

【讨论】:

    猜你喜欢
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 2011-05-30
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多