簡體   English   中英

C ++ 2D矢量按列搜索

[英]C++ 2D vector search by column

我有像這樣的2D矢量: 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
    }
}

親切的問候,Milen Vichev

這種情況下可能的解決方案

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

我認為這樣做的一種方法是通過矩陣的轉置:

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[]訪問元素慢。

可能,如果代碼重構是一個選項,一個好的解決方案是從向量向量更改為1D向量以獲得更好的代碼局部性(類似於https://stackoverflow.com/a/15799557/3235496 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM