我有这样的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
最佳答案 我认为这样做的一种方法是通过矩阵的转置:
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++)
{
// ...
}
循环体内没有什么需要改变,但它是缓慢的.
您可以获得一些速度修改转置以返回矩阵转置的“视图”:
std::vector<std::vector<int *>> transpose(const std::vector<std::vector<int>> &)
无论如何,即使这个解决方案比通过operator []访问元素慢.
也许,如果代码重构是一个选项,一个好的解决方案是从向量向量转换为1D向量以获得更好的代码局部性(类似于https://stackoverflow.com/a/15799557/3235496).