引子

一个问题:如何对不同的数据类型提供同样的指针操作 :::info 答:在底层指针行为上提供一层抽象,取代原本的指针操作(变成一种抽象的指针,并不是对一个个地址操作,而是对一个个数据元素操作) ::: 实现方式?

  • 需要一组对象,能提供由内置的运算符(++,*, ==, !=
  • 设计一组iterator class,实现“和指针一样的语法” :::info 这里的运算符需要由iterator class 的内相关的inline函数提供,比如,对于list iterator而言,指针++会沿着list的指针指向下一个元素,对vector元素而言则会将目前地址加上一个元素的大小 :::

    如何定义并使用标准容器的iterator

    iterator定义需要提供

  • 迭代的对象的类型:用来决定如何访问下个元素

  • iterator所指的元素类型:决定提领操作的返回值

    1. vector<string> svec;
    2. vector<string>::iterator iter =sevc.begin();
    3. //对于const型变量,const_vector 是只能读取,不能改变
    4. const vector<string> cs_vec;
    5. vector<string>:: const_iterator cs_iter=cs_vec.begin();

    :::info 每个标准容器都会提供一个begin()end()函数,分别返回一个iterator指向第一个元素和最后一个元素的下一个位置 ::: 如果需要通过iterator调用底层元素所提供的操作,可以使用arrow,iter->size();
    重新实现后的find()

    1. template<typename IteratorType,typename elemType>
    2. IteratorType find(IteratorType first, IteratorType last, const elemType &value)
    3. {
    4. for(; first!= last;++first)
    5. if( value==*first)
    6. return first;
    7. return last;
    8. }

    仍存在的问题

    first() 实现使用了底部元素所属的==运算符,如果底部元素所属类型不提供该运算符,或是希望equality运算符提供其他功能,则此函数略显弹性不足,优化方法:

  • 传入函数指针,取代原本的equality

  • 运用function object

小结

  • 迭代器是在底层指针行为上提供一层抽象,取代原本的指针操作
  • 迭代器定义时需要指出其对应的数据结构类型以及所指向的元素的类型
  • 标准容器会提供容器的起止迭代器位置;

3.3 所有容器共通的操作

  • ==,!=相等或不相等,比较
  • =赋值assignment
  • empty()is empty?
  • size()返回元素个数
  • clear()清空容器
  • begin()
  • end()
  • insert()插入
  • erase()