とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

cbegin, cend, crbegin および crend

なら書いちゃえ

というわけで,

template<class Container>
 typename Container::const_iterator cbegin(const Container& c)
{
 return c.begin();
}

template<class Container>
 typename Container::const_iterator cend(const Container& c)
{
  return c.end();
}

#include<vector>
#include<iostream>
int main(){
 std::vector<int> v; v.push_back(1), v.push_back(2);

 std::vector<int>::const_iterator iter = cbegin(v); // cbegin を使う!
 const std::vector<int>::const_iterator end = cend(v); // cend を使う!

 // *iter = 3; コンパイルエラー
 for(; iter != end; ++iter)std::cout << *iter << std::endl;
}

出力

1
2

追記

というか C++0x で cbegin, cend が crbegin, crend も含めみんな入るみたいです。
C++0x cbeginとcend - Faith and Brave - C++で遊ぼう
ついでに crbegin と crend も書いちゃいましょう。ほとんど同じだしw

template<class Container>
 typename Container::const_reverse_iterator crbegin(const Container& c)
{
 return c.rbegin();
}

template<class Container>
 typename Container::const_reverse_iterator crend(const Container& c)
{
 return c.rend();
}

#include<vector>
#include<iostream>
int main(){
 std::vector<int> v; v.push_back(1), v.push_back(2);

 std::vector<int>::const_reverse_iterator iter = crbegin(v); // crbegin を使う!
 const std::vector<int>::const_reverse_iterator end = crend(v); // crend を使う!

 // *iter = 3; コンパイルエラー
 for(; iter != end; ++iter)std::cout << *iter << std::endl;
}

出力

2
1