【问题标题】:Iterating 2D and 3D vectors column wise in C++11?在 C++11 中逐列迭代 2D 和 3D 向量?
【发布时间】:2016-12-02 03:58:59
【问题描述】:

我有一个 2D 和 3D 矢量

using namespace std;

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

我知道如何使用两个迭代器逐行迭代二维向量。第一个是“行”的迭代器,第二个是该“行”中“列”的迭代器。现在,我需要迭代二维向量,使第一个迭代器成为“列”的迭代器,第二个成为该“列”中行的迭代器,即按列。

【问题讨论】:

  • 只使用索引。
  • 只是检查是否有更好的方法使用索引。
  • 根据我的经验,如果您有一个已编入索引的容器,迭代器的使用速度通常较慢,尤其是因为取消引用以获取值会增加开销。
  • 如果您按列遍历二维数组,迭代器的开销将是您的问题中最少的。即使使用索引,这种模式否定缓存的事实也会极大地减慢内存访问速度。

标签: c++ c++11 vector


【解决方案1】:

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

如果您实际上不需要使用迭代器并且确实有充分的理由想要以这种奇怪的方式遍历向量的向量(并且知道这将如何通过阻止缓存来减慢内存访问速度)那么它可以使用索引很容易完成。

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

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&lt;array&lt;T, N&gt;&gt; 可能是更好的选择。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 2013-08-14
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 2020-11-01
      相关资源
      最近更新 更多