2

STLイテレータの実装について少し質問があります。

  • なぜイテレータはクラスとしてではなく構造体として定義するのですか?
  • 主な理由は何ですか?
4

4 に答える 4

5

これは実装の選択です。 classstructはほぼ同じC++ですが、デフォルトのアクセス指定子と継承が異なります。これらはクラスではプライベートで、構造体ではパブリックです。したがって、型にプライベートデータメンバーがほとんど必要ない場合は、構造体として実装する方が理にかなっている場合があります。ただし、次のいずれかとまったく同じタイプを実装できます。

struct Iterator : IteratorBase {
  SomeType x;
};

とまったく同じです

class Iterator : public IteratorBase{
 public:
  SomeType x;
};
于 2012-07-08T11:51:52.003 に答える
4

これは、ヘッダーを記述する標準24.2で定義されています。この選択はおそらく、イテレーターがコンテナー要素へのアクセスを提供し、それらを作成しても役に立たないために行われました。唯一の違いは、デフォルトでアクセス レベルがあるのに対し、アクセス レベルがあることです。<iterator>structclassclassprivatestructpublic

classしたがって、代わりにイテレータを宣言する場合、2 つの選択肢がありましたstruct

  • すべてのメンバーを作成します。publicこれは、直接作成しても同じ効果が得られるため、役に立ちませんstruct
  • 不必要なオーバーヘッドと抽象化を提供する getter を作成します。
于 2012-07-08T11:55:49.713 に答える
0

イテレータは構造体によって定義されると誰が言いますか?標準では、それについては何もありません。構造体とクラスの違いは1つだけです。つまり、デフォルトで要素にアクセスできます。したがって、構造体ではデフォルトでアクセスはパブリックであり、クラスではデフォルトでアクセスはプライベートです。

于 2012-07-08T11:51:37.103 に答える
0

ベストアンサーいいね

クラスと構造体は、アクセスを除いて同じです。したがって、構造体を使用するか、クラスを使用しても、大きな違いはありません。

C++にはCが含まれていることがわかっています

構造体の使用は単純に見え、構造体とクラスを区別しています。

これはイテレータの定義です

struct output_iterator_tag{}
struct input_iterator_tag{}
struct forward_iterator_tag : public input_iterator_tag {};
struct bidirectional_iterator_tag : public forward_iterator_tag{}
struct random_accessl_iterator_tag : public bidirectional_iterator_tag{}
于 2012-07-08T16:31:48.683 に答える