【问题标题】:C++ 2D vector search by columnC++ 2D 向量按列搜索
【发布时间】:2014-07-19 22:06:22
【问题描述】:

我有这样的二维向量:vector<vector<int>>。 我正在使用迭代器按行遍历它,但是按列遍历它的最佳做法是什么?

这是我用于按行迭代的代码:

vector<vector<int>> vMatrix (4, vector<int>(4));
vector<vector<int>>::iterator itRow;
vector<int>::iterator itCol;

for (itRow = vMatrix.begin(); itRow != vMatrix.end(); itRow++)
{
    for (itCol = itRow->begin(); itCol != itRow->end(); itCol++) 
    {
        // do some stuff
    }
}

亲切的问候, 米伦·维切夫

【问题讨论】:

    标签: c++ vector multidimensional-array


    【解决方案1】:

    我认为一种方法是通过矩阵的转置:

    std::vector<std::vector<int>> transpose(const std::vector<std::vector<int>> &m)
    {
      using std::vector;
    
      vector<vector<int>> result(m[0].size(), vector<int>(m.size()));
    
      for (vector<int>::size_type i(0); i < m[0].size(); ++i)
        for (vector<int>::size_type j(0); j < m.size(); ++j)
          result[i][j] = m[j][i];
    
      return result;
    }
    

    std::vector<std::vector<int>>::iterator itCol;
    std::vector<int>::iterator itRow;
    std::vector<std::vector<int>> t(transpose(vMatrix));
    
    for (itRow = t.begin(); itRow != t.end(); itRow++)
      for (itCol = itRow->begin(); itCol != itRow->end(); itCol++)
      {
        // ...
      }
    

    在循环体内部没有什么需要改变的,但它很慢。

    您可以加快修改transpose 以返回矩阵转置的“视图”:

    std::vector<std::vector<int *>> transpose(const std::vector<std::vector<int>> &)
    

    无论如何,即使是这个解决方案也比通过operator[] 访问元素要慢。

    如果代码重构是一个选项,一个好的解决方案是从向量向量更改为一维向量以获得更好的代码局部性(类似于https://stackoverflow.com/a/15799557/3235496)。

    【讨论】:

    • 太棒了!非常感谢!
    【解决方案2】:

    在这种情况下可能的解决方案:

    for (int col = 0; col < 4; col++)
    {
        for (int row = 0; row < 4; row++) 
        {
            // do some stuff
        }
    }
    

    【讨论】:

    • 感谢您的回复。我正在寻找带有迭代器的解决方案,因为它应该更快。
    • 好的,我明白了。但是向量的向量对于快速访问正交方向的元素来说是不好的结构。我认为,这种结构没有更好的解决方案。在您的情况下(小型 4x4 矩阵),使用其他东西不会有效。
    • 其实矩阵中的元素不是INT而是对象,只是为了示例方便我使用了INT。我需要以矩阵的形式存储对象,所以我选择了向量来快速访问元素。你会喜欢其他存储方式吗?
    • 有时使用 std::valarray 进行此类操作非常有效。但我不知道你的任务,所以我不能确定它是否适合你。
    • 我需要遍历矩阵,并根据当前单元格的值,检查下一个单元格并可能更改其值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多