侯老师--STL源码剖析--书中的疑问一

侯老师--STL源码剖析--书中的疑问一

前言

我在看侯捷的STL源码剖析一书中第一章Class的语法和语意(第30页)看到了如下的伪代码,我认为是有错误的,因为代码中在没有初始化迭代子的情况下使用。代码如下:

状态8:__STL_MEMBER_TEMPLATES

#include <iostream>

using namespace std;

class alloc{

};

 

template <class T,class Alloc=alloc>

class vector{

public:

    typedef T value_type;

    typedef value_type* iterator;

 

    template <class I>

    void insert(iterator position, I first, I last)

{

        cout<<"insert()"<<endl;

    }

};

 

int main()

{

int ia[5] = {0,1,2,3,4};

vector<int> x;

vector<int>::iterator ite;

x.insert(ite, ia, ia+5);    //insert()

}

    代码中加黑的行出现错误,当编译运行时出错,当然得把iterator和vector用STL库中iterator和vector声明来替换。还有主函式没有返回值。替换后代码如下:

替换后代码

#include <iostream>

#include <vector>

 

using namespace std;

 

int main()

{

int ia[5] = {0,1,2,3,4};

vector<int> x;

vector<int>::iterator ite;

x.insert(ite, ia, ia+5);    //insert()

retrun 0;

}

 

    出错的原因是在定义ite时没有初始化ite。当调用此型insert函式时(当然调用insert(int value)不会出错,它不使用ite),它认为正确初始化了ite(ite此时为无效值,因为没有初始化),所以当它向ite所指向的内存存放数据时出现非法访问。当你在声明vector<int>::iterator ite时进行了正确的初始化就不会出错了。

vector<int>::iterator ite = x.begin();

    书写此文可能有小题大作之嫌,这里指的错误是不初始化指针,但在本例子没有出现非法访问,因为它根本就没有使用ite。但是当我实际应用时,一定要注意初始化,千万不要以为侯老师这么写,就照搬抄写,那你一定会后悔的。作者只是重在语义,也可能是我理解错误。总之,此文仅供参考,如有错误还望来信指正,在下感激不尽。

 

    致谢!

                                                                袁凯

                                                             2001-11-09 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值