迭代器

来源:互联网 发布:windows latex 配置 编辑:程序博客网 时间:2024/06/06 01:28

迭代器的编写Cstring 嵌套类(访问私有成员) 类似普通指针 遍历容器

#include<iostream>#include<string>using namespace std;class Cstring{public:    Cstring(char *p=NULL)//构造函数 带一个参数或不带参数的构造     {        if (p != NULL)        {            mpstr=new char[strlen(p)+1];            strcpy(mpstr,p);        }        else        {            mpstr=new char[1];            *mpstr=0;        }    }    Cstring(const Cstring &src)//因为会发生浅拷贝 所以需要自己定义拷贝构造函数    {        mpstr =new char[strlen(src.mpstr)+1];        strcpy(mpstr,src.mpstr);    }    Cstring & operator=(const Cstring &src)//赋值运算符重载    {        if (this == &src) //防止自赋值        {            return *this;        }        delete []mpstr; //释放原来空间        mpstr=NULL;        mpstr = new char[strlen(src.mpstr) + 1];        strcpy(mpstr,src.mpstr);        return *this;    }    ~Cstring()//析构    {        delete []mpstr;        mpstr=NULL;    }    bool operator >(const Cstring &src)//大于运算符的重载    {        return strcmp(mpstr,src.mpstr) > 0 ? true:false;    }    bool operator <(const Cstring &src)//小于运算符的重载    {        return strcmp(mpstr,src.mpstr) < 0 ? true:false;    }    bool operator == (const Cstring &src)//等于运算符的重载    {        return strcmp(mpstr,src.mpstr) == 0 ? true:false;    }    //求字符串长度大小    unsigned int size()const{return strlen(mpstr);}    //[]运算符的重载函数  [] * -> 一般都实现两种方法 普通方法和常方法    char & operator[](int i){ return mpstr[i];}    //这里char & 之前加const 主要是因为防止参数被修改 只读的“hello”字符串常量不能被修改    const char & operator[](int i)const {return mpstr[i];}    //返回当前指针    const char * c_str()const{return mpstr;}    //解引用重载    char operator *()    {        return *mpstr;    }    const char operator *()const    {        return *mpstr;    }    class Citerator//迭代器    {    public:        Citerator(Cstring *p=NULL,int pos=0):mpiter(p)        {                 mindex=mpiter->mpstr+pos;        }        void operator++()        {            ++mindex;        }        char& operator *(){return *mindex;}        const char& operator *()const {return *mindex;}        //这里的不等于是所指的位置不相等,而不是解引用的值不相等        bool operator !=(const Citerator &src){return mindex != src.mindex ? true:false;}    private:        Cstring *mpiter;//类类型指针,指向该对象的指针,指向要操作的对象        char *mindex;  //用户使用类型的指针,指向目前所在位置的下标    };    Citerator begin(){return Citerator(this,0);}    Citerator end(){return Citerator(this,strlen(mpstr));}    typedef Citerator iterator; //类型重定义private:    char* mpstr;    friend ostream& operator<<(ostream &out, const Cstring &src);};ostream& operator<<(ostream &out, const Cstring &src){    out << src.mpstr;    return out;}int main(){    Cstring str10("helloworld");    Cstring::iterator it =str10.begin(); //这里的it是指针    for ( ; it != str10.end();++it)    {        cout<< *it <<" "; // it.operator*()    }    cout<<endl;}

这里写图片描述

0 0
原创粉丝点击