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

    技术2022-05-11  109

    侯老师--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)