迭代器

迭代器的编写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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值