打印2d Vector的内容时无需将每个标记索引为一个

时间:2019-07-04 02:10:01

标签: c++11 for-loop iteration clang 2d-vector

我试图以初始化二维矢量的方式打印出二维矢量的内容。

#include <iostream>
#include <vector>
using namespace std;

int main(){
    vector<vector<int > > frontier = {{-1,0}, {1,0}, {0,-1}, {0,1}};

    for (int i = 0; i < frontier.size(); i++) {
        for (int j = 0; j < frontier[i].size(); j++) {
            std::cout << frontier[i][j] << ", ";


    }
}
cout << "End of frontier. " << endl;

/* This below is an implementation that I found online but found 
 no
* way to be able to implement the column reference.
*/
for (int i = 0; i < frontier.size(); ++i) {
    for (int j = 0; j < col; ++j) {
        cout << frontier[i + j * col] << ' ';
    }
    cout << endl;
    }
}

这是确定2d向量的内容。到目前为止,此代码可以打印出用逗号分隔的每个索引。另一方面,我需要编写代码来表示新矢量的开始位置。

输出:

-1, 0, 1, 0, 0, -1, 0, 1,  

预期输出:

{{-1,0}, {1,0}, {0,-1}, {0,1}}

1 个答案:

答案 0 :(得分:0)

这就是我的做法:

#include <iostream>
#include <vector>
#include <string>

int main()
{
    std::vector<std::vector<int>> frontier = { {-1,0}, {1,0}, {0,-1}, {0,1} };

    std::string outerPrefix = "";
    std::cout << "{";
    for(const auto& outer : frontier)
    {
        std::cout << outerPrefix << "{";
        std::string innerPrefix = "";
        for(auto inner : outer)
        {
            std::cout << innerPrefix << inner;
            innerPrefix = ",";
        }
        std::cout << "}";
        outerPrefix = ", ";
    }
    std::cout << "}";
}

输出:{{-1,0}, {1,0}, {0,-1}, {0,1}}

在第一个示例中,我使用了range-based for loop。如果您熟悉多种语言中的foreach的概念,那基本上就是一回事。如果您不需要实际的索引变量,那么它会更安全,因为您不必担心被一个变量和在容器外部建立索引。在mapset等容器上,您也需要使用迭代器而不是索引。

如果您要像嵌套索引循环那样执行相同的操作,就像您在原始文档中那样,它可能看起来像这样:

#include <iostream>
#include <vector>
#include <string>

int main()
{
    std::vector<std::vector<int>> frontier = { {-1,0}, {1,0}, {0,-1}, {0,1} };

    std::cout << "{";
    for(size_t outer = 0; outer < frontier.size(); ++outer)
    {
        if (outer != 0)
        {
            std::cout << ", ";
        }
        std::cout << "{";
        for(size_t inner = 0; inner < frontier[outer].size(); ++inner)
        {
            if (inner != 0)
            {
                std::cout << ",";
            }
            std::cout << inner;
        }
        std::cout << "}";
    }
    std::cout << "}";
}