c++ STL容器.size()易造成的bug
在循环中如果使用STL容器.size()作为判断条件,一定要先转化为int类型,否则比较时可能因为算数转换而发生错误。
#a为vector
#易产生bug的写法
for(int i = 0; i<=a.size()-1; i++)
{...}#更健壮的写法
for(int i = 0; i<=int(a.size())-1; i++)
{...}
上述代码中,如果a为空,那么第一种写法会出现bug:无符号整数下溢,a.size()=0,减1后变为极大的正数,此时很可能会导致越界访问甚至缓冲区溢出的问题!而第二种写法可以避免。
实例:kmp算法bug
#kmp算法
#t: target字符串, p: pattern字符串, tindex pindex分别表示遍历位置
while (tindex < t.size() && pindex < p.size())
{if (pindex == -1 || t[tindex] == p[pindex]){tindex++;pindex++;}elsepindex = next[pindex];
}
以上代码乍一看没有任何问题,但运行结果与实际不符。分析后发现pindex=-1,与p.size()比较时出错:算数转换后pindex变为极大的正数,直接退出循环!
正确写法
size()先转换为int,再进行比较。
while (tindex < int(t.size()) && pindex < int(p.size()))
{if (pindex == -1 || t[tindex] == p[pindex]){tindex++;pindex++;}elsepindex = next[pindex];
}