型推論に使用される C++ の auto キーワード
-
C++ の
auto
キーワード -
C++ の関数で
auto
を使用する -
C++ の変数で
auto
を使用する -
C++ のイテレータで
auto
を使用する -
C++ の関数パラメータで
auto
を使用する -
C++ で
auto
キーワードを使用する際の間違い - まとめ
このチュートリアルでは、C++ 11 で導入された auto
キーワードに取り組みます。さまざまな例を見て、その使用例と、使用中に発生する一般的な間違いを理解します。
C++ の auto
キーワード
C++ 11 バージョンのキーワード auto
は、型推論
機能の一部です。型推論とは、コンパイル時に関数または変数のデータ型を推測することを意味します。
したがって、コンパイラがコンパイル時に自動的に推測できるデータ型を指定する必要はありません。return ステートメントは、関数の戻りデータ型を推測するのに役立ちます。
一方、変数の場合、初期化はデータ型の決定に役立ちます。
C++ の関数で auto
を使用する
#include <iostream>
using namespace std;
auto division() {
double a = 55.0;
double b = 6.0;
double ans = a / b;
return ans;
}
int main() { cout << division(); }
出力:
9.16667
ここで、return ステートメントは、コンパイラが division()
関数の戻り型を推測するのに役立ちます。関数は double 型の ans
を返すため、コンパイラは auto
を double に置き換える必要があると推測します。
C++ の変数で auto
を使用する
#include <iostream>
#include <typeinfo>
using namespace std;
int main() {
auto x = 10;
auto y = 10.4;
auto z = "iron man";
cout << x << endl;
cout << y << endl;
cout << z << endl;
}
出力:
10
10.4
iron man
初期化子
とも呼ばれるステートメントの右側に基づいて、コンパイラーは変数のタイプを推測します。
C++ のイテレータで auto
を使用する
vector、set、map などの STL コンテナーを処理する場合、auto
キーワードを使用してそれらを反復処理します。イテレータの長い宣言をスキップすることで、時間の損失を最小限に抑えることができます。
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> v{22, 14, 15, 16};
vector<int>::iterator it = v.begin(); // without auto
auto it2 = v.begin();
while (it2 != v.end()) {
cout << *it2 << " ";
it2++;
}
cout << endl;
map<int, int> mp;
mp.insert(pair<int, int>(1, 40));
mp.insert(pair<int, int>(2, 30));
mp.insert(pair<int, int>(3, 60));
mp.insert(pair<int, int>(4, 20));
map<int, int>::iterator vt = mp.begin(); // without auto
auto vt2 = mp.begin();
while (vt2 != mp.end()) {
cout << vt2->first << " -> " << vt2->second << endl;
vt2++;
}
cout << endl;
}
出力:
22 14 15 16
1 -> 40
2 -> 30
3 -> 60
4 -> 20
auto
を使用する場合と使用しない場合の違いを確認します。auto
がないと、イテレータのタイプを明示的に指定する必要があります。これは、ステートメントが非常に長いため、面倒です。
C++ の関数パラメータで auto
を使用する
C++ では、毎回関数パラメーターを指定する必要がありますが、これは auto
を使用することで簡略化できます。
#include <bits/stdc++.h>
using namespace std;
void myfunc(auto x, auto str) { cout << x << " " << str << endl; }
int main() {
int x = 10;
string str = "Iron Man";
myfunc(x, str);
}
出力:
10 Iron Man
データ型の推定は、関数呼び出し中に行われます。その結果、変数の一致が発生し、コンパイラーはすべての引数の正確なデータ型を把握します。
C++ で auto
キーワードを使用する際の間違い
整数とブールの混同
C++ では、ブール値が 0
または 1
として初期化されることがわかっています。さて、これはデバッグ中に混乱を引き起こす可能性があります。
#include <bits/stdc++.h>
using namespace std;
int main() { auto temp = 0; }
auto
キーワードを使用した複数の宣言
時間を節約するために一度に変数を宣言しますが、両方が異なるタイプの場合、これにより問題が発生する可能性があります。
#include <bits/stdc++.h>
using namespace std;
int main() { auto x = 10, y = 35.66; }
出力:
[Error] inconsistent deduction for 'auto': 'int' and then 'double'
上記のコードをコンパイラーでコンパイルすると、エラーが発生します。これは、コンパイラーが混乱するために発生します。
まとめ
auto
キーワードは、プログラムのより集中的で複雑な部分に焦点を当てて、基本的なコードを書くのに費やす時間を大幅に節約できることを理解しました。非常に便利ですが、使用方法には注意が必要です。