を次のように使用するとしますauto
。
std::vector<int> v;
for (auto i = 0; i < v.size(); ++i) {
...
}
i
C++ がとして推定するのが理想的ですstd::vector<int>::size_type
が、 の初期化子だけi
を見ると、整数が表示されます。i
この場合、推定される型は何ですか? これは適切な使用法auto
ですか?
を宣言するdecltype
代わりに使用します。auto
i
for( decltype(v.size()) i = 0; i < v.size(); ++i ) {
// ...
}
さらに良いことに、@MarkBの回答が示すように、反復子を使用してベクターを反復処理します。
イテレータで問題を解決してみませんか? その後、問題は解決します。
std::vector<int> v;
for (auto i = v.begin(); i != v.end(); ++i) {
...
}
インデックスを使用して反復したい場合は、おそらく型を明示的に綴ります。それが何であるか知っています。auto
主に、不明または入力が難しいテンプレートタイプに使用されると思います。
「これはautoの適切な使用法ですか?」というあなたの質問に対する答えです。他の回答で説明されている理由により、いいえです。コンテナーのコンテンツをループする特定のケースでは、範囲ベースの for ループを使用する方がよいでしょう。
要素への const 参照アクセスi
は次のconst int&
とおりです。
std::vector<int> v;
for (const auto& i : v ) {
std::cout << i << "\n";
}
非 const 参照アクセスi
はint&
次のとおりです。
std::vector<int> v;
for (auto& i : v ) {
++i;
std::cout << i << "\n";
}
値アクセスi
は、次のint
とおりです。
std::vector<int> v;
for (auto i : v ) {
...
}
等々。これは、C スタイルの配列でも機能します。
auto
イニシャライザから排他的に型を取得します。少なくとも変数の型を決定するためには、他の用途には注意が払われません。それも考慮に入れるにdecltype
は、オプションがあります:
for (decltype(v.size()) i = 0; i < v.size(); ++i)
または、ループを逆方向に書き直すことができる場合があります。
for (auto i = v.size(); i-- != 0; )
for
または、ループを完全に回避できる場合があります。