1

以下のコードは、Ubuntu標準パッケージで提供されるクラス初期化子リストです。このイテレータでは、const_iteratorは同じタイプのtypedefです。異なるタイプのイテレータに同じtypedefが必要な理由を知りたかっただけです。イテレータにとって理想的には、typedef_E*イテレータが必要です。

// In the class initializer list:
namespace std 
{ 
  /// initializer_list 
  template<class _E> 
    class initializer_list 
    { 
    public: 
      typedef _E                value_type; 
      typedef const _E&         reference; 
      typedef const _E&         const_reference; 
      typedef size_t            size_type; 
      typedef const _E*         iterator; 
      typedef const _E*         const_iterator;

PS:私は適切なタイトルを考えることができないので、このタイトルを付けました

4

3 に答える 3

5

Containerの要件を満たすには、 と の両方のタイプが存在iteratorするconst_iterator必要があります。多くのアルゴリズムと多くのコードは、これらの両方のタイプを利用できるコンテナに依存しています。iteratorただし、型が非const(可変) イテレータでなければならない理由はありません。この場合、 と の両方が(不変の) イテレーターであるiteratorと判断しました。const_iteratorconst

両方のイテレータをそのままにしている理由はconst、 の値を変更できるようにしたくないことが明らかだからですinitializer_list

この別の例として、 whosとtypes が両方とも定数イテレータでstd::setあることを見てみましょう。s には順序付けられた要素が含まれているため、 の内容を変更できる場合、その順序付けは無効になります。これを防ぐために、両方のイテレータ型を不変にします。iteratorconst_iteratorstd::setstd::set

于 2013-02-13T17:43:09.787 に答える
2

これらのフィールドは、 の要件を満たすすべてのタイプで必要とされるためですContainerstd::initializer_listの場合、iteratorとが同じになるのはたまたまです const_iterator

于 2013-02-13T17:41:54.713 に答える
0

おそらく、初期化子リスト内に格納されている値を変更したくないためです。それらは、コンストラクターに渡される一時的なオブジェクトであることを意図しています。

C++ には、ジェネリック型に適用されるコンセプトと呼ばれる (今のところ非公式な) 理想があります。コンテナーの概念では、オブジェクトで特定の typedef を使用できる必要があります。std::initializer_list はコンテナーであるため、::iterator と ::const_iterator の両方の typedef が必要です。ただし、std::set と同様に、initializer_list 内の要素をユーザーに変更させたくないため、::iterator は ::const_iterator と同じです: どちらも読み取り専用です。

于 2013-02-13T17:42:26.523 に答える