| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1408 人关注过本帖
标题:vector数组用at就报错说访问越界,用[]就没问题,求指教。
只看楼主 加入收藏
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
收藏
已结贴  问题点数:20 回复次数:2 
vector数组用at就报错说访问越界,用[]就没问题,求指教。
程序代码:
#include <iostream>
#include <vector>
using namespace std;

class Manacher
{
    public:
        string manach(const string &s) const;
};
string Manacher::manach(const string &s) const
{
    if(s.length()<0)
        return "";
    
    string t("$#");
    for(auto it=s.cbegin();it!=s.cend();++it)
    {
        t+=(*it);
        t+="#";
    }
    vector<int> a(t.length(),0);
    
    int Max_r=0,id=0,res=0,res_len=0;
    for(int i=1;i<t.length();++i)
    {
        /*a.at(i)=Max_r>i?min(a.at(2*id-i),Max_r-i):1;    
        while(t.at(i+a.at(i))==t.at(i-a.at(i)))
            ++a.at(i);*/ //这样写就会报错,说访问越界 
        
        a[i]=Max_r>i?min(a[2*id-i],Max_r-i):1;//这样写没问题 
        while(t[i+a[i]]==t[i-a[i]])
            ++a[i];
            
        if(Max_r<i+a.at(i))
        {
            id=i;
            Max_r=i+a.at(i);
        }
        
        if(res<a.at(i))
        {
            res=i;
            res_len=a.at(i);
        }
    }
    return s.substr((res-res_len)/2,res_len-1);
}
int main()
{
    string s1("1221");
    Manacher m;
    cout<<m.manach(s1)<<endl;
    return 0;
}
搜索更多相关主题的帖子: vector 越界 string const int 
2019-03-15 12:13
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:20 
你是想知道“为什么会访问越界?”,还是想知道“访问越界时,为什么at会报错,而[]不报?”?

如果是前者,你自己调试一下就看出i+a.at(i)为10了,想必不需要别人帮忙;
如果是后者,C++标准就是这么规定的,at越界时抛出std::out_of_range异常,operator[]越界时属于未定义行为。
2019-03-15 14:32
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
以下是引用rjsp在2019-3-15 14:32:45的发言:

想知道“访问越界时,为什么at会报错,而[]不报?”?

如果是后者,C++标准就是这么规定的,at越界时抛出std::out_of_range异常,operator[]越界时属于未定义行为。


这个程序只访问到字符串的最后一个字符即:'\0',我把发生异常的代码放到try中捕获,catch中放继续希望执行的代码应该可以吧
2019-03-15 16:40
快速回复:vector数组用at就报错说访问越界,用[]就没问题,求指教。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024381 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved