11

を次のように使用するとしますauto

std::vector<int> v;
for (auto i = 0; i < v.size(); ++i) {
   ...
}

iC++ がとして推定するのが理想的ですstd::vector<int>::size_typeが、 の初期化子だけiを見ると、整数が表示されます。iこの場合、推定される型は何ですか? これは適切な使用法autoですか?

4

4 に答える 4

22

を宣言するdecltype代わりに使用します。autoi

for( decltype(v.size()) i = 0; i < v.size(); ++i ) {
  // ...
}

さらに良いことに、@MarkBの回答が示すように、反復子を使用してベクターを反復処理します。

于 2012-03-27T23:18:02.447 に答える
13

イテレータで問題を解決してみませんか? その後、問題は解決します。

std::vector<int> v;
for (auto i = v.begin(); i != v.end(); ++i) {
   ...
}

インデックスを使用して反復したい場合は、おそらく型を明示的に綴ります。それが何であるか知っています。auto主に、不明または入力が難しいテンプレートタイプに使用されると思います。

于 2012-03-27T23:15:06.697 に答える
7

「これはautoの適切な使用法ですか?」というあなたの質問に対する答えです。他の回答で説明されている理由により、いいえです。コンテナーのコンテンツをループする特定のケースでは、範囲ベースの for ループを使用する方がよいでしょう。

要素への const 参照アクセスiは次のconst int&とおりです。

std::vector<int> v;
for (const auto& i :  v ) {
   std::cout << i << "\n";
}

非 const 参照アクセスiint&次のとおりです。

std::vector<int> v;
for (auto& i :  v ) {
   ++i;
   std::cout << i << "\n";
}

値アクセスiは、次のintとおりです。

std::vector<int> v;
for (auto i :  v ) {
   ...
}

等々。これは、C スタイルの配列でも機能します。

于 2012-03-28T06:16:55.407 に答える
4

autoイニシャライザから排他的に型を取得します。少なくとも変数の型を決定するためには、他の用途には注意が払われません。それも考慮に入れるにdecltypeは、オプションがあります:

for (decltype(v.size()) i = 0; i < v.size(); ++i)

または、ループを逆方向に書き直すことができる場合があります。

for (auto i = v.size(); i-- != 0; )

forまたは、ループを完全に回避できる場合があります。

于 2012-03-27T23:17:18.800 に答える