对数组,容器,二维数组遍历操作时,遵循左闭右开原则可以使代码更有序,尤其是在二分法代码中。
典型的问题:给定一个mxn的二维数组,按照如图所示的方式遍历输出。
这个问题如果不使用左闭右开的原则书写代码,则常常会使调试代码陷入混乱。因为遍历循环的边界控制原则不一致出现各种bug,因此要使用统一的左闭右开原则控制代码。
要注意以下3种情况。
void traverseMatrix(int **mat, int m, int n){ //二维数组形参传入 **mat
int startx=0, starty=0, endx=m-1, endy=n-1;//m,n是数组的维度
int i,j;
while(startx<=endx && starty<=endy){
for(j=starty; j<endy; ++j){cout<<mat[startx][j];}
if(startx==endx){ cout<<mat[startx][endy]; return ;}
for(i=startx; i<endx; ++i){cout<<mat[i][endy];}
if(starty==endy){ cout<<mat[endx][starty]; return ;}
for(;j>starty; --j){ cout<<mat[endx][j];}
for(; i>startx; --i){ cout<<mat[i][starty];}
startx++;starty++;endx--;endy--;
}
}
案例:JZ29.顺时针打印链表
按照左闭右开的原则编写的代码可以通过测试
在STL中容器迭代器的设计中应用了这个原则,容器中的finish迭代器通常指向容器最后一个元素的下一个位置,即finish=NULL,在循环条件中,可以写iter!=finish(注意,所有普通迭代器重载了==,!=运算符。)