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,从源代码弄过来只改了前两个名字,那个忘记改了。
展开
 我来答
heresy_me
2014-05-30 · TA获得超过1719个赞
知道小有建树答主
回答量:1708
采纳率:42%
帮助的人:297万
展开全部
大至上,iter--是不导致崩溃的,而是这样做后再引用它时才崩溃。VC6.0那是应该是0应该是转换了,可能VC6的iteator就是个ptrdiff_t的typedef(而ptrdiff_t是int的typedef),但VS2010的却没有那么简单。
更多追问追答
追问
对它进行关系运算也会出错吗?在关系运算中有涉及到对那个迭代器的引用吗?
追答
会,bool greater(iterator iter1, iterator iter2) { return &*iter1 > &*iter2; }如果比较谁更大,是这样实现的。
zjfaok
2014-05-30 · TA获得超过6805个赞
知道大有可为答主
回答量:4146
采纳率:62%
帮助的人:1574万
展开全部
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();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式