为什么我不能用这种方式解引用2D向量的迭代器?



下面的代码是对一个问题的简单实现,在这个问题中,一个由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

编译(除了错误)我遇到了以下错误:

错误:indirection要求指针操作数('std::vector<int;std::>"无效)如果(* (row_it + 1) = = 1,,* (col_it) [index_row] = = 1)

我希望通过以下逻辑来工作:col_itvector<vector<int>>::iterator类型,因此对迭代器*(col_it)进行解引用应该会给我vector<vector<int>>本身,并且通过使用[]符号,我应该能够访问内部向量。为什么在这种情况下不起作用?

这一切都归结为操作符优先级:由于下标操作符([])比一元操作符*具有更高的优先级,因此表达式

*(col_it)[index_row]

被计算为

*(col_it[index_row])

不、

(*col_it)[index_row]

。对vector<vector<int>>::iterator类型的表达式应用下标操作符会产生对vector<int>的引用,对于该类型的表达式,没有实现一元*操作符,从而导致观察到的编译错误。