侯老师--STL源码剖析--书中的疑问一XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
前言
我在看侯捷的STL源码剖析一书中”第一章Class的语法和语意(第30页)”看到了如下的伪代码,我认为是有错误的,因为代码中在没有初始化迭代子的情况下使用。代码如下:
状态8:__STL_MEMBER_TEMPLATES
#include
using namespace std;
class alloc{
};
template
class vector{
public:
typedef T value_type;
typedef value_type* iterator;
template
void insert(iterator position, I first, I last)
{
cout<<"insert()"< } }; int main() { int ia[5] = {0,1,2,3,4}; vector vector x.insert(ite, ia, ia+5); //insert() } 代码中加黑的行出现错误,当编译运行时出错,当然得把iterator和vector用STL库中iterator和vector声明来替换。还有主函式没有返回值。替换后代码如下: #include #include using namespace std; int main() { int ia[5] = {0,1,2,3,4}; vector vector x.insert(ite, ia, ia+5); //insert() retrun 0; } 出错的原因是在定义ite时没有初始化ite。当调用此型insert函式时(当然调用insert(int value)不会出错,它不使用ite),它认为正确初始化了ite(ite此时为无效值,因为没有初始化),所以当它向ite所指向的内存存放数据时出现非法访问。当你在声明vector vector 书写此文可能有小题大作之嫌,这里指的错误是不初始化指针,但在本例子没有出现非法访问,因为它根本就没有使用ite。但是当我实际应用时,一定要注意初始化,千万不要以为侯老师这么写,就照搬抄写,那你一定会后悔的。作者只是重在语义,也可能是我理解错误。总之,此文仅供参考,如有错误还望来信指正,在下感激不尽。 致谢! 袁凯 2001-11-09 替换后代码