c++,string迭代器超出范围出错
string类的迭代器为什么不能超出头?我想要依次遍历每一位的值,象下面代码:string::iteratorit;for(it=(str.end()-1);it>=st...
string类的迭代器为什么不能超出头?我想要依次遍历每一位的值,象下面代码:
string::iterator it;
for(it=(str.end()-1);it>=str.begin();--it1)
{
//其他代码
}
这样子在VC6.0中运行时没有问题,但我转到VS2010上运行时,就在最后一次循环,也就是刚好it=str.begin()时结束后执行--it1,然后就出错了,直接崩溃!!而且为什么VC6.0中string类的insert(0,‘0’)有效,而VS2010中则提示没有这一参数列表,又只能全部改成insert(str.begin(),1,'0')这是为什么?
后来为了解决这个错误,我只好在for循环体内加上了个判断来跳出,好像string类还有个逆迭代器,那个rbegin()地址是与end()地址相同还是等于end()-1?rend()是等于begin()还是begin()-1?
源代码中的累加条件写错了,应该是--it,从源代码弄过来只改了前两个名字,那个忘记改了。 展开
string::iterator it;
for(it=(str.end()-1);it>=str.begin();--it1)
{
//其他代码
}
这样子在VC6.0中运行时没有问题,但我转到VS2010上运行时,就在最后一次循环,也就是刚好it=str.begin()时结束后执行--it1,然后就出错了,直接崩溃!!而且为什么VC6.0中string类的insert(0,‘0’)有效,而VS2010中则提示没有这一参数列表,又只能全部改成insert(str.begin(),1,'0')这是为什么?
后来为了解决这个错误,我只好在for循环体内加上了个判断来跳出,好像string类还有个逆迭代器,那个rbegin()地址是与end()地址相同还是等于end()-1?rend()是等于begin()还是begin()-1?
源代码中的累加条件写错了,应该是--it,从源代码弄过来只改了前两个名字,那个忘记改了。 展开
2个回答
展开全部
大至上,iter--是不导致崩溃的,而是这样做后再引用它时才崩溃。VC6.0那是应该是0应该是转换了,可能VC6的iteator就是个ptrdiff_t的typedef(而ptrdiff_t是int的typedef),但VS2010的却没有那么简单。
更多追问追答
追问
对它进行关系运算也会出错吗?在关系运算中有涉及到对那个迭代器的引用吗?
追答
会,bool greater(iterator iter1, iterator iter2) { return &*iter1 > &*iter2; }如果比较谁更大,是这样实现的。
展开全部
for(it=(str.end()-1);it>=str.begin();--it1)
^^ ^^ ^^^
it 和 it1 不同,是源代码中就是如此吗?
追问
忘改了,本来有两个迭代器,一个it1,一个it2,为了提问改成it,最后那个忘改了,经确认不是名称的问题。嗯,那个it1改成It
追答
看起来是VS检测到str.begin()不能 -1 ,否则就超出str对应的字符串的内存范围了,这是C++标准规定的。所以VS没有错。
关于rbegin()/rend()
*str.rbegin()==*(str.end()-1);
*(str.rend()-1)==*str.begin();
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询