以下代码是一个问题解决方案的天真实现,其中将 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>>
本身并且通过使用 []
符号我应该能够访问内部向量。为什么这在这种情况下不起作用?
这一切都归结为运算符优先级:由于下标运算符(
[]
)比一元运算符*
具有更高的优先级,因此表达式
*(col_it)[index_row]
被评价为
*(col_it[index_row])
, 不像那样
(*col_it)[index_row]
.应用于
vector<vector<int>>::iterator
类型表达式的下标运算符产生对 vector<int>
的引用,对于这种类型的表达式,未实现一元 *
运算符,导致观察到编译器错误。