1

次のイテレータクラスのを理解したいと思います。何をしinput_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;
}
4

1 に答える 1

4

あなたが彼らに尋ねた順序で、あなたの質問への答えは次のとおりです:

1)input_iterator_tagここで説明されています:http://en.cppreference.com/w/cpp/iterator/iterator_tags

したがって、(コンパイル時に)それが入力イテレータであることをmyiterator拡張および指定します。また、反復するタイプがであると指定します。(警告:テンプレートとイテレーターの経験があまりないので、これは私が最も確信が持てない答えです。)iteratorint

2)はい、mit.pはポインタですがp、そうであるため、p(ポインタ)は(ポインタでもあります)のコピーとして初期化されていますmit.p。したがって、両方とも同じメモリ位置を指します。

3)*thisイテレータ自体です。つまり、thisはを使用してメソッドを呼び出している実際のイテレータオブジェクトへのポインタであり、そのオブジェクトの実際の値、つまりイテレータ自体もthis同様です。*this

4)配列はC ++ではポインターとして扱うことができます。配列を保持する変数は、基本的に配列の最初の要素へのポインターと同じように動作します。したがって、ポインタ引数の代わりに配列引数を渡すことは合法です。

于 2013-03-10T05:17:13.347 に答える