数学やプログラミングの備忘録

数理最適化, Python, C++をメインに紹介するブログ。

MENU

C++14: おぅっと驚く auto の使い方 [入門]

c++を書く上でとても便利な auto の使い方を入門者レベルで紹介します。

サンプルコードもあるので、是非参考にしてください。

目次

  1. 簡単な説明
  2. サンプルコード

簡単な説明

変数宣言のとき、型を記述するところがありますよね?

int x = 1;
double y = 2.0;

上の例だと、intdouble が型を記述するところです。

このように型を明示的に記述せずに、auto と記述すると、コンパイル時に自動で変数の型を決定します

auto x = 1;
auto y = 2.0;

上記の場合、auto は初期化子(=の右辺)から型を推論しています。

サンプルコード

次に、サンプルコードを見ながら、autoおうっと 驚くほどに便利であることを解説していきます。

#include <iostream>
#include <vector>

class Memo {
   int val;
   public:
      Memo( int a ) { val = a; }
      auto getVal() { return val; } // auto: 返り値の型を推論 -> int
};

int main( int argc, char** argv){

   auto x = 1; // auto: xの型を推論 -> int
   auto p = &x; // auto: yの型を推論 -> int*

   *p = 2;

   std::vector<int> vec( 3 ); // サイズ3のベクトルを生成

   // auto: イテレータの型名をautoで推論 -> std::vector<int>::iterator
   for ( auto it = vec.begin(); it != vec.end(); ++it )
      *it = x++;

   // auto: コンテナの要素を推論 -> int&
   for ( auto& v : vec )
   {
      Memo m( v*v ); // 2乗してメモ
      std::cout << m.getVal() << std::endl; // メモした値を出力
   }

   return 0;
}

auto を使っているのを上から見ていきます。

関数の返り値による型推論

auto getVal() { return val; } // auto: 返り値の型を推論 -> int

ここでは、auto は関数の返り値を推論します。

これだけではありがたみを感じにくいですが、例えば開発段階で変数 val の型を変更したとき、修正箇所が1箇所で済むのが利点の一つです。

初期化子による型推論

auto x = 1; // auto: xの型を推論 -> int
auto p = &x; // auto: yの型を推論 -> int*

これは上で説明した通り、初期化子(=の右辺)から xp の型を推論しています。

イテレータの型名を auto で推論

for ( auto it = vec.begin(); it != vec.end(); ++it )
   *it = x++;

これは開発をする上で非常に嬉しいですよね。もし、明示的に型を宣言するなら、

for ( std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it )
   *it = x++;

このようになりめんどうです。auto を活用することで、

  • タイプ数が減る
  • 可読性も上がる(デバックしやすくなる)

といったメリットがあるのが実感できると思います。

範囲for文でのコンテナの要素を推論

for ( auto& v : vec )

もし、auto を使わないなら、

for ( int& v : vec )

こうなります。

ここもあまりありがたみを感じにくいですが、「関数の返り値による型推論」と同様に、vec の型を変更したときに、修正箇所が1箇所で済むのが利点の一つです。

以上となります、皆さん auto をどんどん使ってみてください。

すぐに使えて、得した気分になれますよ!