下面的代码是对一个问题的简单实现,在这个问题中,一个由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_it
是vector<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>
的引用,对于该类型的表达式,没有实现一元*
操作符,从而导致观察到的编译错误。