[C++11]auto変数とconst_iterator |
2014年12月12日22:30:43 |
|
自動で型推論をしてくれるauto変数ですがイテレータを扱う時には注意が必要です。
auto変数はconst_iteratorなのか普通のiteratorか判別がつかないので
普通にbeginを書くとconst_iteratorにはなりません。
そこでC++11から追加されたcbeginを使えばconst_iteratorを返してくれます。
終端のconst_iteratorはcendです。普通に回す分には今まで通りendで問題ありません。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #include <cstdio>
#include <array>
int main()
{
std::array<int,5> arr = { 1, 2, 3, 4, 5 };
auto ite1 = arr.begin();
auto ite2 = arr.cbegin();
printf( "%s\n", typeid(ite1).name() );
printf( "%s\n", typeid(ite2).name() );
return 0;
} |
出力:
class std::_Array_iterator
class std::_Array_const_iterator |
const_iteratorを利用したループの書き方
※単純にループするだけならforeachをオススメします。
イテレータは削除や挿入が必要な場合に利用するのがいいと思います。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #include <cstdio>
#include <array>
int main()
{
std::array<int,5> arr = { 1, 2, 3, 4, 5 };
for( auto ite=arr.cbegin(); ite != arr.cend(); ++ite )
{
printf( "%d\n", *ite );
}
return 0;
} |
auto変数についての説明はこちら
[C++11]auto変数を使おう!ただし慎重に...
foreachについての説明はこちら
[C++11]イテレータとはおさらばforeach |
|