使用迭代器的错误之一:对迭代器越界值解引用,而且这种情况是发生在判断条件中,比较隐蔽

问题代码

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
void prin_vec (ostream& Out,vector<string>& word_list)
{
    vector<string>::const_iterator i,j;
    i=word_list.begin();
    sort(word_list.begin(),word_list.end());
    while(i!=word_list.end())
    {
        j=i;
        while(*j==*i &&j!=word_list.end() )
            j++;

        Out<<(*i )<<" occur "<<j-i<<" times"<<endl;
        i=j;
    }
}
int main()
{
    string s;
    vector<string> word_list;
    while(cin>>s)
        word_list.push_back(s);
    prin_vec(cout,word_list);
}
注意这个片段

while(*j==*i &&j!=word_list.end() )
j++;

    Out<<(*i )<<" occur "<<j-i<<" times"<<endl;
    i=j;
}
如果j++之后j变为越界值,那么对J进行解引用会导致运行报错。
而因为是发生在判断语句中的,所以可能比较难以察觉。
错误代码

*j==*i &&j!=word_list.end()


正确代码

j!=word_list.end() && *j==*i
“`

也就是变成先检测j是否是越界值,是就不用解引用,否则解引用。

错误警示

当使用迭代器时,先弄一个单独的判断是否越界,再在之后的下个if中判断其他条件。

其他警示

调试过程中箭头指向的代码段不是正在执行的,而是下一条即将执行的,因此如果指向某条之后再选择下一条就马上报错,则问题出现再某条,而不是下一条。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值