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
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)