如何构造迭代器类?

时间:2013-03-10 05:05:23

标签: c++ pointers iterator

我希望了解迭代器类的以下exampleinput_iterator_tag做了什么? mit.p是否用作构造函数中使用的值,但不是mit.p指针?什么是*this?如果构造函数只允许整数和指针/值引用,是否允许myiterator beginning(numbers)

// iterator example
#include <iostream>
#include <iterator>
using namespace std;

class myiterator : public iterator<input_iterator_tag, int>   // what is input_iterator_tag?
{
  int* p;
public:
  myiterator(int* x) :p(x) {}
  myiterator(const myiterator& mit) : p(mit.p) {}  // why isn't this p(*mit.p)?
  myiterator& operator++() {++p;return *this;}   // what is *this?
  myiterator operator++(int) {myiterator tmp(*this); operator++(); return tmp;}
  bool operator==(const myiterator& rhs) {return p==rhs.p;}
  bool operator!=(const myiterator& rhs) {return p!=rhs.p;}
  int& operator*() {return *p;}
};

int main () {
  int numbers[]={10,20,30,40,50};
  myiterator beginning(numbers);   // however, constructor is not overloaded with array
  myiterator end(numbers+5);
  for (myiterator it=beginning; it!=end; it++)
      cout << *it << " ";
  cout << endl;

  return 0;
}

1 个答案:

答案 0 :(得分:4)

按照您提出的顺序,您的问题的答案是:

1)此处解释input_iterator_taghttp://en.cppreference.com/w/cpp/iterator/iterator_tags

因此,myiterator扩展iterator并指定(在编译时)它是输入迭代器。它还指定它迭代的类型是int。 (警告:这是我最不确定的答案,因为我对模板和迭代器没有太多经验。)

2)是的,mit.p是指针,但p也是如此,因此p(指针)被初始化为mit.p的副本(也是指针)。因此,它们都指向相同的内存位置。

3)*this是迭代器本身。也就是说,this是指向实际迭代器对象使用this调用方法的指针,因此*this是该对象的实际值:迭代器本身。

4)数组可以被视为C ++中的指针:包含数组的变量的行为与指向数组中第一个元素的指针基本相同。因此,传递数组参数而不是指针参数是合法的。