1.迭代器属性-不全

迭代器
  • STL提供的所有算法都是模板,所以需要通过迭代器来对这些模板进行特例化;对象指针使可以用来当做任意种类的迭代器的;
  • 迭代器主要包含<utility>,<iterator>,<memory>三种;
    这里写图片描述
  • 输出迭代器
    • 1.使用输出迭代器来存取序列中的元素,存取包含存和取;通常通过循环来完成,需要保证按照有序方式来进行创建;

      for(;<not done>;++next)
      *next = <whatvecr>;
    • 2.next表示的是类型为X的一个对象;./输出迭代器的属性.png;
    • 3.输出迭代器需要定义的操作包括:
      • 1.*next=<whatever><whatever>的值赋值给序列中将要产生的下一个元素;
      • 2.++next指向下一个需要操作的元素;
      • 3.必须保证输出迭代器在存储每一个元素后得以增加;
      • 4.必须保证输出迭代器在两次存储的间隔增加的次数不会超过一次;
  • 输入迭代器
    这里写图片描述
    • 1.输入迭代器用来产生新的序列.为了存取已有的值,或者指示需要对已有的序列进行遍历;

      for(p=first;p!=last;++p)
      <process>(*p);
    • 2.p,first,last表示的都是迭代器类型X的对象,其中last并不表示实际序列中的任何一个元素,用于表示结尾的标志,不能够尝试获得这些元素的值;
    • 3.迭代器需要定义的操作包括:
      • 1.当两个类型为X的迭代器pq没有指向同一个元素,既p!=q;
      • 2.*p是类型T的一个右值value.右值表示的是一个拥有值表达式但是并不一定需要来引用一个对象;
      • 3.++p用来改变p的值,用来指向下一个元素;./输入迭代器.png;

        while(first!=last)
        <process>(*first++);
    • 4.输入迭代器的操作和输出迭代器的操作都需要包含复制构造函数,析构函数以及赋值运算符;
  • 前向迭代器
    这里写图片描述
    • 1.迭代器更加普遍的用法是存取一个完全存储在内存中的序列;如果存在这几方面的需求:
      • 1.对于序列中的元素同时具有读和写的权利;
      • 2.需要在所要存取的任意地方标注出下一个位置作为书签用于下次存取;
    • 2.两个前向迭代器必须在同一个值域里面;
    • 3.前向迭代器类似于指向单向列表中元素的指针;./前向迭代器.png;
  • 双向迭代器
    • 1.双向迭代器支持递增以及递减操作;双向迭代器类似于双项链表中的元素的指针;
    • 2.如果迭代器指向的不是链表的末端,可以通过它来存取链表中的元素,或者移动到序列中下一个元素的位置;
  • 随机存取迭代器
    这里写图片描述

    • 1.随机存取迭代器支持整型值的加减操作,指针之间的相减,两个迭代器在序列中的顺序比较操作,以及使用下表方式操作该迭代器等;
    • 2.所有适用于双向迭代器的属性也适用于随机存取迭代器;
  • 迭代器的使用选择

    • 1.只写操作:前向迭代器,双向迭代器,随机存取迭代器;
    • 2.只读操作:前向迭代器,双向迭代器,随机存取迭代器;
    • 3.读写操作:双向迭代器,随机存取迭代器;
  • utility

    • 1.在utility中包含的是:只有模板类的pair,一些与之相关的模板函数和操作符,以及其他四个模板操作符;
    • 2.pair:可以构造pair<T,U>对象然后通过x.first以及x.second来访问对象里面的成员;
    • make_pair()是用来创建产生pair对象,但是通过这种方法在生成pair对象时,会忽略掉所有的const属性,也就是说不可以通过make_pair对象来产生
      一个含有一个或这多个常量成员;也可以通过显示调用pair<T,U>(x,y)来生成pair对象;
    • 3.operator== operator<是用来比较两个pair对象的;
    • 如果在使用pair的过程中出现pair对象没有定义的错误,需要包含pair对象;