我有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;中行的迭代器。即列式。
答案 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>>
不知道行和列,所以让最外面的向量表示列而不是行。
打印到终端时这很痛苦,这可能是按行进行的,但如果内部首选列布局,那就这样做。