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)
为什么?
是.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的评论值得注意.
归档时间: |
|
查看次数: |
596 次 |
最近记录: |