vectpr越界问题

我们在使用vector的时候,会遇到这样的问题,用[]访问vector中的存储对象,下标越界了,但是编译器并没有报错,我们用at操作函数取该下标对应的值的时候,就报错了,这是怎么一回事?

我们在使用vector的时候,都会提前给它分配一定的内存空间,它的大小是m=capacity()的返回值,而不是n=size()的返回值,当我们访问下标介于m和n之间的对象时,因为我们实际上已经为该下标分配了内存,只是没有对其进行初始化赋值,所以用[]取值的时候,返回的实际上是一个随机数。

但是我们用at()操作函数时,就报了错,我在网上查了一下资料,原因大概是这样

at函数 
语法: 
TYPE at( size_type loc );
at() 函数 返回当前Vector指定位置loc的元素的引用. at() 函数 比 [] 运算符更加安全, 因为它不会让你去访问到Vector内越界的元素. 例如, 考虑下面的代码:
vector<int> v( 5, 1 );
for( int i = 0; i < 10; i++ ) {
cout << "Element " << i << " is " << v[i] << endl;
}
这段代码访问了vector末尾以后的元素,这将可能导致很危险的结果.以下的代码将更加安全: 
vector<int> v( 5, 1 );
for( int i = 0; i < 10; i++ ) {
cout << "Element " << i << " is " << v.at(i) << endl;
}
取代试图访问内存里非法值的作法,at() 函数能够辨别出访问是否越界并在越界的时候抛出一个异常out_of_range.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值