您的位置:首页 > 其它

vector subscript out of range

2009-11-24 14:25 393 查看
当初写日志,只是为了记录一下自己所做的事情,没想到会有别人来看。所以没有任何的解释,只是胡乱写了些东西。

其实问题很简单,题目已经说明一切,错误就是越界,仔细检查代码,找出什么地方可能会越界就行了

昨天运行程序时,突然出现了如题所述的错误。错误很明显,vector的下标越界了,但是之前一直没有什么问题啊,于是我仔细读代码,debug,然后拿出前天能运行的程序,依然会出现这个错误。

开始时不甘心,一直想着昨天之前都能运行,错误应该出在昨天的代码里面。

于是找啊找,找了一天终于还是没有找到。

今天继续找,不过今天已经不找昨天写的代码了,开始看看里面调用的之前的函数,结果很短时间就找出来了,一个很低级的手误。。。

总结:不能太相信自己,适当相信这些“标准”,毕竟是这么多人总结出来,被更多的人用,提示这个错误就先找找这种错误

要更加仔细

要学会debug,写完代码多运行几遍

另外,明白了vector里面的at & [],源码如下:

const_reference at(size_type _Pos) const
{	// subscript nonmutable sequence with checking
if (size() <= _Pos)
_Xran();
return (*(begin() + _Pos));
}
reference at(size_type _Pos)
{	// subscript mutable sequence with checking
if (size() <= _Pos)
_Xran();
return (*(begin() + _Pos));
}
const_reference operator[](size_type _Pos) const
{	// subscript nonmutable sequence
#if _HAS_ITERATOR_DEBUGGING
if (size() <= _Pos)
{
_DEBUG_ERROR("vector subscript out of range");
_SCL_SECURE_OUT_OF_RANGE;
}
#endif /* _HAS_ITERATOR_DEBUGGING */
_SCL_SECURE_VALIDATE_RANGE(_Pos < size());
return (*(_Myfirst + _Pos));
}
reference operator[](size_type _Pos)
{	// subscript mutable sequence
#if _HAS_ITERATOR_DEBUGGING
if (size() <= _Pos)
{
_DEBUG_ERROR("vector subscript out of range");
_SCL_SECURE_OUT_OF_RANGE;
}
#endif /* _HAS_ITERATOR_DEBUGGING */
_SCL_SECURE_VALIDATE_RANGE(_Pos < size());
return (*(_Myfirst + _Pos));
}


The difference between this member function and member operator function operator[] is that vector::at signals if the requested position is out of range by throwing an out_of_range exception.
operator [] signals only if _HAS_ITERATOR_DEBUGGING.虽然不是太明白,但是应该是at()会检查越界,而[]除了在这种debug时,是不会查越界的。所以我以后还是用.at()吧。不过 这样会降低效率,还是[]在实际中应该会好些。一是简单可读,二是只在调试的时候查越界,调试完使用时不检查,节约时间。
不过好像c++ 0x会两个都检查了。不清楚,等待新标准
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: