实施矢量矢量

时间:2015-09-07 21:31:48

标签: c++ matrix vector

我实际上是在矢量矢量上运行。但是我如何增加行和列指针(这里的指针意味着迭代器) 我的代码就像

bool searchMatrix(vector<vector<int>>& matrix, int target) {

    vector< vector<int> >::iterator row=matrix.begin();
    vector<int>::iterator col=row->begin();

    while(row!=matrix.end()&&col!=row->end())
    {
        if(*col==target)
            return true;
        else
        {
            if(*(col)+1<=target)
                ++col;
            else
                ++row;
        }
    }
    return false;
}

2 个答案:

答案 0 :(得分:0)

如果你需要搜索整个矩阵,你需要有2个循环:外部为行,内部为列 - 这看起来更明显。

bool searchMatrix(vector<vector<int>>& matrix, int target) {
    for (vector< vector<int> >::iterator row=matrix.begin(); row != matrix.end(); ++row) {
       for (vector<int>::iterator col=row->begin(); col != col.end(); ++col){
          if(*col==target)
             return true;
       }
    }
    return false;
}

...但是当所有行的长度不同时,这种方法会更好。如果这是一个矩形矩阵,最好将它全部保存在一个长度为row * col的矢量中 您可以为它编写访问器方法(如果您愿意,我会将非模板方法带入过度复杂化):

int& getElement(<vector<int>& matrix, size_t matrixWidth, size_t row, size_t col)
{
   // here's no boundary check!!!
   return matrix[row * matrixWidth + col];
}

在这种情况下,您的搜索会变得简单:

bool searchMatrix(vector<vector<int>>& matrix, int target) {
    for (vector<int>::iterator item=matrix.begin(); item != matrix.end(); ++item){
        if(*item==target)
            return true;
    }
    return false;
}

答案 1 :(得分:0)

使用迭代器而不是索引来赋予向量中的位置主要是样式选择。如果向量向量是您数据结构的一个不错的选择(一个单独的问题),并且您所需的算法如图所示,那么您已经达到了样式选择的极限,是时候放弃样式并专注于功能。

更简单地说:不要使用迭代器,使用索引。

bool searchMatrix(vector<vector<int>>& matrix, int target) {

    std::size_t row=0;
    std::size_t col=0;

    while(row!=matrix.size()&&col<matrix[row].size())
    {
        if(matrix[row][col]==target)
            return true;
        else
        {
            if(matrix[row][col]+1<=target)
                ++col;
            else
                ++row;
        }
    }
    return false;
}