迭代向量时自动与具体类型?

Jam*_*ard 7 c++ int auto c++11

我正在阅读的这本书在迭代时给出了这个例子 vector

for (auto &e: v) {
  cout << e << endl;
}
Run Code Online (Sandbox Code Playgroud)

假设v被声明为vector<int> v,换句话说,我们知道这个集合中的元素类型是int.

auto以任何方式使用更好或更喜欢?

for (int &e: v) {
  cout << e << endl;
}
Run Code Online (Sandbox Code Playgroud)

为什么?

Naw*_*waz 6

是.auto是优选的.因为如果您更改以下声明v:

std::vector<int> v;  //before 
Run Code Online (Sandbox Code Playgroud)

对此:

std::vector<float> v; //after
Run Code Online (Sandbox Code Playgroud)

如果您使用int &for,那么你就必须改变这一点.但是auto,没有必要改变!

在我看来,使用auto或多或少就像编程接口.因此,如果您+=在循环中执行操作,并且您并不真正关心循环变量的类型,e只要该类型支持+=操作,那么auto解决方案是:

for(auto & e : v)
{
      e += 2;
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,所有你关心的是类型e支持+=int右手边.它甚至会工作为用户定义的类型,其中已经定义operator+=(int),或 operator+=(T)其中T是支持从隐式转换类型int.就好像你正在编程接口:

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
}
Run Code Online (Sandbox Code Playgroud)

当然,你想把这个循环写成:

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

或者只是这个:

for(auto animal : animals)
{
       animal->eat(food); //still program to interface
}
Run Code Online (Sandbox Code Playgroud)

它仍然是编程接口.

但与此同时,@ David的评论值得注意.

  • 这可以通过两种方式读取,可能更好的是得到一个编译错误,说`int&`不能从`float&`设置而不是编译器默默地接受那些用于int的代码...不是说它有一个更好的想法是`int &`,这一切都取决于你在`for`循环体内做了什么,如果它不依赖于确切的类型`auto`会更好 (6认同)