type - c++++ 11




ベクトルを反復処理するときのAuto型とコンクリート型? (2)

あなたの最初の例では、ベクトルの要素が何であるかに依存することが少なくなります。

一ヶ月以内にベクトルがより大きな整数を格納する必要があると仮定して、 std::vector<int64_t> 、またはその他のより広い型を使用する必要があります。 現在、そのベクトルに対して反復処理を行うコードはすべて無効です。 それぞれを変更する必要があります:

for (int &e: v) {}

のために:

for (int64_t &e: v) {}

それで、 autoに内部型を推論するほうが良いのです。 そうすれば、ベクターに格納されているタイプを別の互換性のあるものに変更でき、すべてのコードは引き続き動作します。

私が読んでいるこの本は、 vector反復するときにこの例を提供しています

for (auto &e: v) {
  cout << e << endl;
}

vがvector<int> vとして宣言されているとします。つまり、このコレクション内の要素の型がintであることがわかります。

どのようにしても、より良い、あるいは優先的にautoを使用していますか?

for (int &e: v) {
  cout << e << endl;
}

どうして?


はい。 autoが好ましい。 あなたがvの宣言を次のものから変更するなら、

std::vector<int> v;  //before 

これに:

std::vector<float> v; //after

forを使用するfor 、それを変更する必要があります。 しかし、 auto 、変更する必要はありません!

私の意見では、 auto使って作業することは、多かれ少なかれインターフェイスとのプログラミングにています 。 したがって、ループで+=演算を行い、ループ変数e型が実際に+= operationをサポートしているかどうかを気にしない場合、 autoが解です。

for(auto & e : v)
{
      e += 2;
}

この例では、 eの型が右辺にint +=サポートしていることを気にしています。 operator+=(int) 、またはoperator+=(T)定義したユーザー定義型に対しても機能しますTintからの暗黙的変換をサポートする型です。 それはあなたがインターフェイスするようにプログラミングしているかのようです:

std::vector<Animal*> animals;
animals.push_back(new Dog());
animals.push_back(new Cat());
animals.push_back(new Horse());

for(size_t i = 0 ; i < animals.size(); ++i)
{
       animals[i]->eat(food); //program to interface
}

もちろん、このループを次のように記述したいと思います。

for(Animal * animal : animals)
{
       animal->eat(food); //still program to interface
}

または単にこれです:

for(auto animal : animals)
{
       animal->eat(food); //still program to interface
}

それはまだインターフェイスをプログラミングしています

しかし同時に、@ Davidのコメントのポイントは注目に値する。





auto