読者です 読者をやめる 読者になる 読者になる

C++0x cbeginとcend

C++

C++0x では各コンテナに const_iterator を返す cbegin() と cend() というメンバ関数が追加されます。
イテレータが const である必要がある場合はこちらを使用することになります。

namespace std {
  template <class T, class Allocator = allocator<T>>
  class vector {
  public:
    ...

    // iterators:
    iterator               begin();
    const_iterator         begin() const;
    iterator               end();
    const_iterator         end() const;
    reverse_iterator       rbegin();
    const_reverse_iterator rbegin() const;
    reverse_iterator       rend();
    const_reverse_iterator rend() const;

    // 追加
    const_iterator         cbegin() const;
    const_iterator         cend() const;
    const_reverse_iterator crbegin() const;
    const_reverse_iterator crend() const;
  };
}

これが必要になるケースは、 auto を使用したイテレータ操作とか。

vector<int> v;
for (auto it = v.cbegin(); it != v.cend(); ++it) {
    ...
}

vector::const_iterator で v.begin() や v.end() を受け取れば const_iterator になるけど
auto を使用した場合は iterator になっちゃうので cbegin()/cend() が必要になります。


ほかにも、アルゴリズムにイテレータを渡すときに「この範囲は変更されない」ということを明示するためとか。

struct functor { void operator()() const { ... } };

vector<int> v;
for_each(v.cbegin(), v.cend(), functor());


N1674 A Proposal to Improve const_iterator Use from C++0X Containers

N1865 A Proposal to Improve const_iterator Use (version 2)

N1913 A Proposal to Improve const_iterator Use (version 3)

C++0x言語拡張まとめ