为什么我无法以这种方式取消引用 2D 向量的迭代器?

问题描述 投票:0回答:1

以下代码是一个问题解决方案的天真实现,其中将 1 和 0 的二维向量输入到某个函数

closedIsland
,其中某些列和行中的 1 表示水,0 表示土地。该算法的目的是找到“封闭岛屿”的数量,这些岛屿是被水包围的陆地。我正在使用迭代器循环向量,并且我编写了一个名为
checkSurroundings
的辅助函数来为特定情况实施一些逻辑检查。为了简洁起见,我排除了除其中一个以外的所有情况。我的错误就是在这个函数中发生的。

#include <vector>

 bool checkSurroundings(std::vector<std::vector<int>>::iterator col_it,std::vector<int>::iterator row_it, int index_column, int index_row, int max_row_size, int max_col_size){
        bool is_surrounded = false; 
        switch(index_column){
            case 0: 
                col_it++; 
                switch(index_row){
                    case 0:
                        if(*(row_it+1)==1 && *(col_it)[index_row]==1) //error here
                            is_surrounded = true; 
                        break;
                   //other cases follow
                }
                break;
//other cases follow
}
}

int closedIsland(std::vector<std::vector<int>>& grid) {
    int max_column_size = grid.size(); 
    int max_row_size = grid[0].size(); 
    int closed_island_count = 0; 
    bool is_surrounded = false;

    for(std::vector<std::vector<int>>::iterator column_it = grid.begin(); column_it!=grid.end(); column_it+1){
        for(std::vector<int>::iterator row_it = column_it->begin(); row_it!= column_it->end(); row_it+1){
            auto index_column = std::distance(column_it,grid.end());
            auto index_row = std::distance(row_it,column_it->end());

            if(*row_it == 0){
                is_surrounded = checkSurroundings(column_it,row_it,index_column,index_row,max_row_size,max_column_size); 
                if(is_surrounded)
                    closed_island_count++;
            }
        }
    }
    return closed_island_count; 
}

上面的代码编译(除了错误)使用

g++ -std=c++17

我遇到了以下错误:

错误:间接需要指针操作数('std::vector' 无效) 如果(*(row_it+1)==1 && *(col_it)[index_row]==1)

我期待它按照以下逻辑工作:

col_it
是一个
vector<vector<int>>::iterator
类型所以取消引用迭代器
*(col_it)
应该给我
vector<vector<int>>
本身并且通过使用
[]
符号我应该能够访问内部向量。为什么这在这种情况下不起作用?

c++ pointers iterator
1个回答
3
投票

这一切都归结为运算符优先级:由于下标运算符(

[]
)比一元运算符
*
具有更高的优先级,因此表达式

*(col_it)[index_row]

被评价为

*(col_it[index_row])

, 不像那样

(*col_it)[index_row]

.应用于

vector<vector<int>>::iterator
类型表达式的下标运算符产生对
vector<int>
的引用,对于这种类型的表达式,未实现一元
*
运算符,导致观察到编译器错误。

© www.soinside.com 2019 - 2024. All rights reserved.