在C ++ 11中逐列迭代2D和3D向量?

时间:2016-12-02 03:59:00

标签: c++ c++11 vector

我有2D和3D矢量

using namespace std;

vector< vector<int> > vec_2d;
vector<vector<vector<int>>> vec_3d

我知道如何使用两个迭代器逐行迭代2D向量。 &#34;行&#34;的第一个迭代器第二个是&#34;列&#34;的迭代器。在那&#34;行&#34;。现在,我需要迭代2D向量,使第一个迭代器成为&#34;列的迭代器&#34;第二个是&#34;列&#34;中行的迭代器。即列式。

2 个答案:

答案 0 :(得分:1)

使用迭代器,这将非常困难。我会说你可能需要implement your own iterator classes inheriting from std::iterator<random_access_iterator_tag, Type>

如果你实际上并不需要使用迭代器,并且真的有充分的理由希望以这种奇怪的方式遍历向量的向量(并且知道这将如何通过阻止缓存来减慢内存访问)那么它可以可以使用索引轻松完成。

这是一个使用索引的例子,它处理内部向量长度不同的棘手情况。

using namespace std;

int main()
{
    vector< vector<int> > vec_2d = { {1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10} };

    bool is_col_out_of_bounds = false;
    for (size_t col=0; ! is_col_out_of_bounds; col++)
    {
        is_col_out_of_bounds = true;
        for (size_t row=0; row<vec_2d.size(); row++)
        {
            if (col < vec_2d[row].size())
            {
                is_col_out_of_bounds = false;
                cout << vec_2d[row][col] << endl;
            }
        }
    }

    return 0;
}

输出:

1
4
8
2
5
9
3
6
10
7

如果您想保证所有行的长度相同,那么vector<array<T, N>>可能是更好的选择。

答案 1 :(得分:0)

一个简单的答案:谁说你的布局应该按行解释? std::vector<std::vector<Foo>>不知道行和列,所以让最外面的向量表示列而不是行。

打印到终端时这很痛苦,这可能是按行进行的,但如果内部首选列布局,那就这样做。