个人主页:Jason_from_China-CSDN博客
所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客
所属栏目:C++知识点的补充_Jason_from_China的博客-CSDN博客
string模拟实现迭代器
迭代器的实现
主要实现的两种迭代器
- 这里我们实现迭代器我们主要实现的是begin(),end(),其他都差不多
- 注意实现的时候,const和非const是有区别的
iterator end(); const_iterator end();//const采取const_iterator的方式来区分非const//.h文件,放到类里面//迭代器的实现 //iterator通常是一个类型别名或者一个具体的类类型的名称,它被用来表示具有迭代器功能的对象。在 C++ 标准库中,迭代器是一种用于遍历容器中元素的对象,它提供了一些特定的操作,如解引用、递增、递减、比较等。 //iterator通常是一个类型别名或类类型,用于表示可以遍历特定容器中元素的迭代器对象。它定义了迭代器的行为和操作,如解引用(获取指向的元素)、递增(移动到下一个元素)、比较等。 // 所以在我们还没有学到容器的情况下我们可以直接对iterator进行封装,从而变相实现迭代器//typedef char* iterator;//iterator的第一种封装方式 using iterator = char*;//iterator第二种封装方式是 using const_iterator =const char*; iterator begin(); const_iterator begin()const;//这里后面的const也是需要加上的,因为在istream类里面,是加上的,这里不加上会报错 iterator end(); const_iterator end()const;//这里后面的const也是需要加上的,因为在istream类里面,是加上的,这里不加上会报错
//.cpp文件,string的实现文件//这里是类里面定义的,所以是需要突破类域的 string::iterator string::begin() {return _str; } string::iterator string::end() {//end指向的是\0return _str + _size; } string::const_iterator string::begin()const {return _str; } string::const_iterator string::end()const {//end指向的是\0return _str + _size; }
头文件代码解释
- 重命名的方式有两种,一种是typedef,一种是using,我们采取using的方式
- using iterator = char*;,首先我们把char*类型重命名为iterator
- 我们把const char*;,类型重命名为const_iterator
- end采取相同的逻辑
实现文件的解释
- 这里实现文件比较好理解,begin(),返回的首元素地址
- end(),返回的是最后一个元素的后一个位置的地址
- const就是修饰后,只能读不能写的元素,目的是防止产生权限放大和缩小的问题
- 也就是,当创建一个const修饰的string的类的时候,如果我们调用迭代器,并且此时没有const类型进行匹配,那么我创建的类是不可修改的,只是可读的,如果我调用迭代器,迭代器是可以修改,可以读的,此时就产生了权限放大的问题
C++ const成员函数-CSDN博客注意事项:
- 实现迭代器之后我们不需要实现语法糖范围for了,因为范围for的底层是迭代器
- 这一点了解就可以